Eventlet или Gevent или Stackless + Twisted, Pylons, Django и SQL Alchemy
Мы широко используем Twisted для приложений, требующих большого количества асинхронных операций ввода-вывода. В некоторых случаях вместо этого вещи связаны с процессором, и для этого мы создаем пул процессов для выполнения работы и имеем систему для управления ими на нескольких серверах - и все это делается в Twisted. Работает отлично. Проблема в том, что трудно привести новых членов команды в курс дела. Написание асинхронного кода в Twisted требует почти вертикальной кривой обучения. Как будто люди просто так не думают.
Возможно, мы рассматриваем смешанный подход. Возможно, сохраните серверную часть xmlrpc и управление процессами в Twisted и внедрите другие компоненты в код, который, по крайней мере, до некоторой степени выглядит синхронно, хотя и не является таковым. С другой стороны, мне больше нравится явное, чем неявное, поэтому я должен подумать об этом немного больше. Во всяком случае, на гринлеты - насколько хорошо это работает? Так что есть Stackless, и, как вы можете видеть из моего Gallentean-аватара, я хорошо знаю, насколько успешен он в использовании флагманской онлайн-игры EVE от CCP. А как насчет Eventlet или Gevent? Ну, пока только Eventlet работает с Twisted. Однако Gevent утверждает, что он быстрее, поскольку это не просто реализация Python, а скорее полагается на libevent. Он также утверждает, что имеет меньше идиосинкразий и дефектов. Насколько я могу судить, он поддерживается одним парнем. Это делает меня несколько осторожным, но все замечательные проекты начинаются таким образом, так что... Потом есть PyPy - я еще не закончил читать об этом - просто видел это в этой теме: Недостатки Stackless.
Так запутанно - мне интересно, что, черт возьми, делать - звучит как Eventlet, вероятно, лучшая ставка, но достаточно ли она стабильна? У кого-нибудь есть опыт? Должны ли мы использовать Stackless вместо него, поскольку он существует и является проверенной технологией - точно так же, как и Twisted - и они прекрасно работают вместе. Но все же я ненавижу иметь отдельную версию Python для этого. что делать....
Эта несколько неприятная запись в блоге ударила меня по голове: " Асинхронный ввод-вывод для взрослых" Я не понимаю, что Twisted похож на Java-замечание, так как для меня Java обычно там, где вы находитесь в многопоточном мышлении, но неважно. Тем не менее, если эта штука с обезьяньим патчем действительно работает, то ничего себе. Просто вау!
4 ответа
Вы можете проверить:
Eventlet и gevent на самом деле не сравнимы со Stackless, потому что Stackless поставляется со стандартной библиотекой, которая не знает о тасклетах. Существуют реализации сокетов для Stackless, но нет ничего более всеобъемлющего, чем gevent.monkey. CCP не использует голые кости Stackless, у него есть нечто, называемое Stackless I/O, которое AFAIK только для окон и никогда не было открытым исходным кодом (?).
И eventlet, и gevent могут работать на Stackless, а не на greenlet. В какой-то момент мы даже попытались сделать это как проект GSoC, но не нашли студента.
Отвечая на часть вашего вопроса - если вы посмотрите на http://speed.pypy.org/ вы увидите, что использование витой поверх PyPy может дать вам некоторые ускорения. Конечно, это зависит от вашей рабочей нагрузки, но, вероятно, стоит проверить.
Ура,
fijal
Я создал небольшое веб-приложение в реальном времени поверх eventlet и repoze.bfg (я давно разочаровался в django). Я считаю, что исправление событий и патчей для обезьян так же просто, как говорит Тед.