Действительно ли гринлеты полезны сами по себе?

#python #greenlets

#python #гринлеты

Вопрос:

У меня возникли некоторые проблемы с концептуализацией того, что такое гринлеты. Я понимаю, как возможность переключения между запущенными функциями в одном и том же процессе может открыть дверь в мир возможностей; но я не встречал ни одного примера того, как они решают проблемы, которые стандартные методы python не могут (кроме проблемы с вложенными функциями в генераторах — что, честно говоря … «meh»).

Возьмите этот пример с главной страницы greenlet, которая в основном представляет собой более сложный способ сделать это:

 def test0():
    print 12
    print 56
    print 34
 

Я знаю, что это просто лишний пример, но, похоже, это длинный и короткий из того, что могут делать гринлеты. Если вы не настолько помешаны на контроле, что вам приходится решать, когда, где и как выполняется каждая строка кода в вашем приложении, как можно test0 улучшить использование гринлетов? Или возьмем пример с графическим интерфейсом (который в первую очередь заинтересовал меня в гринлетах); Не сложно ли обдумать стратегию, которая не требует while цикла process_commands , нет?

Я видел, что некоторые интересные вещи можно сделать с помощью гринлетов; но только в сочетании с какой-то другой темной магией, реализованной в другом пакете (например, Stackless, gevent и т. Д.). Даже с ними гринлетов недостаточно, требуя их подкласса.

Мой вопрос:

Каковы некоторые реальные примеры того, как можно использовать гринлеты сами по себе для улучшения функциональности python? Я подозреваю, что ответ заключается в создании сетей — вероятно, именно поэтому я не понимаю. Но есть ли другие?

Комментарии:

1. Это не совсем ответ, но я настоятельно рекомендую ознакомиться с этой статьей основателя Twisted . В нем обсуждаются различные типы параллелизма, включая гринлеты. В конечном итоге он утверждает, что параллелизм, использующий библиотеки, подобные greenlet, уступает другим вариантам, но это может помочь объяснить, почему люди его используют.

2. Также стоит посмотреть: это сообщение в блоге автора Motor, который является асинхронным драйвером для MongoDB. Двигатель достигает своего асинхронного поведения, оборачивая синхронный драйвер pymongo в гринлеты.

Ответ №1:

Обратите внимание, что в вашем примере все print s явно объединены в одну функцию. В реальной программе у вас есть не просто две функции; у вас есть произвольное количество функций, некоторые из них даже из сторонних библиотек, которые вы не контролируете, и переписать весь этот код для чередования всех операторов не так просто.

Графические интерфейсы на самом деле являются отличным примером: позволяя циклу событий (кстати, именно так вы обрабатываете команды на практике) приостанавливать себя, когда нет событий для чтения, ваш графический интерфейс может оставаться интерактивным в том же потоке. Если бы цикл событий должен был фактически остановиться и ждать, пока пользователь нажмет клавишу, ваш графический интерфейс зависнет, потому что ничто не будет указывать ОС перерисовывать окно.

Не то чтобы я был большим поклонником gevent в частности; Я делаю ставку на библиотеку stdlib asyncio. 🙂 Но на самом деле это все та же идея: когда вам нужно выполнить какую-то работу, которая требует много времени ожидания, пусть тем временем выполняется другой код.

Комментарии:

1. Итак, гринлеты полезны при асинхронных вводах, и когда вы хотите использовать код monkeypatch, который вы не писали? Это нормально; но как насчет другого кода, который вы написали? Из того, что я читал, многие, похоже, приветствуют гринлеты (зеленые потоки) как своего рода «мессию параллелизма», который пришел, чтобы спасти нас от ГИЛ-сатаны python и других демонов программирования. Достаточно ли этих двух применений, чтобы оправдать такой пьедестал?

2. операции блокировки обычно строятся на входных и выходных примитивах, встроенных в библиотеку или фреймворк, поэтому чередование не является вариантом. и, в конечном счете, есть только одно применение, но я думаю, что ввод-вывод — достаточно распространенная операция, чтобы вызвать некоторое волнение, да. 🙂

Ответ №2:

По сути, любая проблема, при которой вы не хотите блокировать остальную часть приложения, ожидая, пока что-то «вернется к вам» (например sleep , socket ). Или, другими словами, любая проблема, в которой разработка, основанная на событиях, упростит задачу.

  • Сеть, как вы упомянули.
  • Графический интерфейс.
  • Симуляции / игры, в которых у вас может быть 1000 актеров, и вы хотите, чтобы они в какой-то степени действовали независимо.
  • Склеивание синхронно с асинхронными библиотеками / фреймворками.