Подтвердить что ты не робот

Python/Erlang: Какая разница между Twisted, Stackless, Greenlet, Eventlet, Corouts? Являются ли они похожими на процессы Эрланга?

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

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

Все, кто мог бы помочь мне понять эту тему, были бы очень благодарны.

4b9b3361

Ответ 1

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

Сейчас:

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

Ответ 2

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

Макроскопически:

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

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

Ответ 3

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

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

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

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