Python/Erlang: Какая разница между Twisted, Stackless, Greenlet, Eventlet, Corouts? Являются ли они похожими на процессы Эрланга?
Мое неполное понимание заключается в том, что Twisted, Stackless, Greenlet, Eventlet, Coroutines используют асинхронные сетевые IO и пользовательские потоки, которые очень легкие и быстрые для переключения. Но я не уверен, в чем разница между ними.
Также они очень похожи на процессы Erlang. Они почти одинаковы?
Все, кто мог бы помочь мне понять эту тему, были бы очень благодарны.
Ответы
Ответ 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 с травлением. Возможно, это изменит картину, опять же: -)