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

StackOverflow https://stackoverflow.com/questions/4263059

Вопрос

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

Также они звучат очень похожи на процессы Erlang. Они в значительной степени то же самое?

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

Это было полезно?

Решение

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

Сейчас:

  • Скрученный Классический неблокирующий каркас ввода / вывода - код приложения написан в Async Style, используя обратные вызовы.
  • Завещание а также соревнование использовать резина Библиотека для Coroutines / Greenthreads / Greenlets. Существует одна выделенная Greenlet для запуска EventLoop (в случае сэВЕНТ, это C-кодированное либелконтур событий). Когда произвольная Greenlet начинает ждать некоторую операцию ввода / вывода для обработки, она просто дает выполнение в цикл события, что запускает другой Greenlet для выполнения (который готов сделать какой-то ввод / вывод). Это называется кооперативной многозадачкой - каждый зеленый летает решает, когда вернуть контроль на другие зелени.
  • Ущерб Имеет задачи, которые похожи на Greenlets, но также могут быть запланированы с упреждающей моделью - это означает, что планировщик может остановить выполнение задач в любое время и начать выполнение другого Tasklet (именно в том, как работают потоки OS и процессы Erlang). Кроме того, Statureless не предоставляет никаких неблокирующих средств ввода / вывода из коробки, поэтому, если вы делаете ввод / вывод через stdlib - он заблокирует всю нить ОС, поэтому другой Tasklet не может выполняться во время / O. Были попытки предоставить порту библиотеки Gevent для Stackelless, но я не знаю, как это происходит.

Другие советы

Приманки взято! (исправляет добро пожаловать!):

Громко:

  • Скрученный: одиночный резьб. достигает неблокирующего поведения с помощью использования «обратных вызовов» и «отсроченных» идиом. Похоже на Node.js.
  • Greenlet / Eventlet: используйте «зеленые нити» (разделы памяти?) Для достижения неблокирующихся IO. На самом деле исправляет стандартный CPYthon io с их версиями, поэтому код все еще записан так, как будто он блокирует / последовательно.
  • StateLess: http://www.stackless.com/. Отказ Не использовал его, похоже, он добавляет «микротирки» и других никущих? Цветущий пример идиомы
  • Coroutines: Корутины на так

Ничего из них не так же легкие или хорошо поддерживаются в качестве процессов ERLANG.

Вы почти правы при сравнении Stackless к Greenlet. Пропуская вещь:

Stockless se не Добавить что-то. Вместо этого Greenlet, изобретена через 5 лет после раскрытия, удаляет определенные вещи. Это написано достаточно просто, чтобы быть построенным в виде модуля расширения вместо переводчика замены.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top