Python/Erlang: в чем разница между Twisted, Stackless, Greenlet, Eventlet, Coroutines? Они похожи на процессы Erlang?

Мое неполное понимание заключается в том, что Twisted, Stackless, Greenlet, Eventlet, Coroutines используют асинхронный сетевой ввод-вывод и пользовательские потоки, которые очень легкие и быстро переключаются. Но я не уверен, каковы различия между ними.

Также они очень похожи на процессы Erlang. Они примерно одинаковые?

Любой, кто может помочь мне лучше понять эту тему, будет очень признателен.


person Continuation    schedule 24.11.2010    source источник


Ответы (3)


Во-первых, неблокирующий ввод-вывод не имеет ничего общего с зелеными потоками или сопрограммами, но может повлиять на их планирование.

В настоящее время:

  • Twisted — это классический неблокирующий фреймворк ввода-вывода — код приложения написан в асинхронном стиле с использованием обратных вызовов.
  • Gevent и eventlet используйте библиотеку greenlet для сопрограмм/greenthreads/greenlets. Существует один выделенный гринлет для запуска цикла событий (в случае gevent это C-coded libevent). цикл событий). Когда произвольный гринлет начинает ожидать обработки какой-либо операции ввода-вывода, он просто передает выполнение циклу обработки событий, который запускает для выполнения другой гринлет (который готов выполнять некоторые операции ввода-вывода). Это называется совместной многозадачностью — каждый гринлет сам решает, когда передать управление другим гринлетам.
  • В Stackless есть тасклеты, которые похожи на гринлеты, но также могут может остановить выполнение тасклета в любое время и начать выполнение другого тасклета (так работают потоки ОС и процессы Erlang). Кроме того, Stackless не предоставляет каких-либо неблокирующих средств ввода-вывода из коробки, поэтому, если вы выполняете ввод-вывод через stdlib — он заблокирует весь поток ОС, поэтому никакой другой тасклет не сможет выполняться, пока вы ожидаете I. /О. Были попытки предоставить порт библиотеки gevent для Stackless, но я не знаю, как это происходит.
person andreypopp    schedule 24.11.2010
comment
Twisted также позволяет писать асинхронный код без использования обратных вызовов и конечных автоматов с помощью декоратора twisted.internet.defer.inlineCallbacks, что позволит программисту использовать сопрограммы на основе генератора (yield) для получения значительно более читаемого кода, чем с обратными вызовами. - person Erik Kaplun; 30.12.2011
comment
Существует один выделенный гринлет для запуска событийного цикла(...) Не может ли более одного гринлета содержать свой собственный цикл событий, который, по сути, позволяет этим циклам событий взаимодействовать? - person Piotr Dobrogost; 20.04.2013

Наживка взята! (исправления приветствуются!):

Грубо:

  • скрученный: однозаходный. достигает неблокирующего поведения за счет использования «обратных вызовов» и «отложенных» идиом. Похоже на node.js.
  • greenlet/eventlet: используйте «зеленые потоки» (разделы памяти?) для достижения неблокирующего ввода-вывода. На самом деле патчит стандартный ввод-вывод CPython своими версиями, поэтому код по-прежнему пишется так, как если бы он был блокирующим/последовательным.
  • без стека: http://www.stackless.com/. Не использовали его, похоже, он добавляет «микропотоки» и другие тонкости? примеры идиом без стека
  • сопрограммы: сопрограммы на SO

Ни один из них не является таким легким или хорошо поддерживаемым, как процессы Erlang.

person Gregg Lind    schedule 24.11.2010
comment
Twisted не является однопоточным как таковым, он имеет первоклассную поддержку многопоточности и пулов потоков. Кроме того, (по крайней мере) его API базы данных использует потоки по умолчанию. (дополнительно см. мой комментарий к ответу andreypopp) - person Erik Kaplun; 30.12.2011
comment
Кроме того, как сказал andreypopp, гринлеты не имеют ничего общего с неблокирующим вводом-выводом — они ортогональны. - person Erik Kaplun; 30.12.2011

Вы почти правы, сравнивая Stackless с Greenlet. Недостающее:

Stackless сам по себе ничего не добавляет. Вместо этого Greenlet, изобретенный через 5 лет после Stackless, убирает некоторые вещи. Он написан достаточно просто, чтобы его можно было построить как модуль расширения вместо замещающего интерпретатора.

Это действительно забавно — Stackless имеет гораздо больше возможностей, примерно в 10 раз более эффективен при переключении и обеспечивает травление состояния выполнения.

Greenlet все же выигрывает, наверное, только за счет простоты использования в качестве модуля расширения. Поэтому я думаю о том, чтобы обратить процесс вспять, расширив Гринлет травлением. Может быть, это изменило бы картину, опять же :-)

person tismer    schedule 18.03.2012