Python / Erlang: В чем разница между Twisted, Stackless, Greenlet, Eventlet, Coroutines? Они похожи на процессы Эрланга? - PullRequest
30 голосов
/ 24 ноября 2010

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

Также они звучат очень похоже на процессы Эрланга.Являются ли они в значительной степени одним и тем же?

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

Ответы [ 3 ]

37 голосов
/ 24 ноября 2010

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

Сейчас:

  • Twisted - это классическая неблокирующая структура ввода / вывода - код приложения написан в асинхронном стиле с использованием обратных вызовов.
  • Gevent и eventlet use библиотека greenlet для сопрограмм / greenthreads / greenlets.Существует один выделенный гринлет для запуска eventloop (в случае gevent это C-кодированный libevent цикл обработки событий).Когда произвольный гринлет начинает ждать обработки какой-либо операции ввода-вывода, он просто передает выполнение в цикл обработки событий, который запускает другой гринлет для выполнения (который готов выполнить некоторый ввод-вывод).Это называется кооперативной многозадачностью - каждый гринлет решает сам, когда вернуть управление другим гринлетам.
  • Stackless имеет тасклеты, которые похожи на гринлеты, но могут также планироваться с вытесняющей моделью -это означает, что планировщик может в любой момент остановить выполнение тасклета и запустить выполнение другого тасклета (именно так работают потоки ОС и процессы Erlang).Кроме того, Stackless не предоставляет никаких неблокирующих средств ввода / вывода из коробки, поэтому, если вы делаете ввод / вывод через stdlib - он блокирует весь поток ОС, поэтому никакой другой тасклет не может выполняться, пока вы ожидаете I/ вывода.Были попытки предоставить порт библиотеки gevent для Stackless, но я не знаю, как это происходит.
11 голосов
/ 24 ноября 2010

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

Брутто:

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

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

9 голосов
/ 19 марта 2012

Вы почти правы, сравнивая Stackless в Гринлет. Пропавшая вещь:

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

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

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

...