Примерно год назад, во время массовой истерии по поводу питонячих и не очень асинхронных серверов, я, пытаясь составить своё мнение обо всем об этом, набрел на интересную библиотеку - greenlet. На которой базируется сетевая библиотека eventlet, а на ней всю очередь WSGI веб-сервер spawning.
Как видно из названия, она позволяет делать легкие треды - гринлеты в обычном не stackless питоне. Я написал небольшой скрипт "на попробовать":
#!/usr/bin/env python
from greenlet import greenlet
def dispatch():
while True:
for w in workers:
w.switch()
print 'dispatch'
if not all(workers):
break
d = greenlet(dispatch)
def worker(name):
for i in range(5):
print name, i
if i % 2 == 0:
print 'switch'
d.switch()
workers = [
greenlet(lambda: worker('foo')),
greenlet(lambda: worker('bar'))
]
print 'start'
d.switch()
print 'done'
вывод:
start
foo 0
switch
dispatch
bar 0
switch
dispatch
foo 1
foo 2
switch
dispatch
bar 1
bar 2
switch
dispatch
foo 3
foo 4
switch
dispatch
bar 3
bar 4
switch
dispatch
done
и вот недавно набрел на него. Правда прекрасно? Такой простор для творчества - передача контекста выполнения в произвольное место с сохранением состояния. Некий намек на потусторонний call/cc из "других" языков.
Ещё тогда у меня родилась идея где это можно интересно применить. Увы так свою идею я не реализовал пока - но запал остался!
Комментарии 8
Не помню точно почему, но "потусторонний call/cc" на гринлетах у меня не вышел пару-тройку лет назад. зато со стеклесом вышло весьма забавно.
Оставлен 29 Октябрь 2009 в 10:16 ¶А что за идея то?... которая родилась где применить...
Оставлен 29 Октябрь 2009 в 10:55 ¶Что за идея?
Оставлен 29 Октябрь 2009 в 11:12 ¶О боже, Александр, спасибо за развязку. Честно, я начал читать и сердце замерло; думаю, щас будет обсирать асинхронные вебсервера, скажет, что все должны хотеть только джангу под апачем. Серьёзно, спасибо, что не так.
Ещё, я хотел бы уточнить, как пишут на сайте проекта, что она позволяет именно делать легкие потоки. greenlet это не легкие потоки из коробки. Вот тебе пришлось написать несколько строчек для этого. Приятная сторона в том, что greenlet позволяет делать не только лёгкие потоки. Но как раз это, с намёком на call/cc, ты уже упомянул.
P.S.: в хроме под виндой ввод комментария жутко скачет, потому что под словом "Предпросмотр" появляется новый параграф с тремя точками (зачем?), а через пару секунд исчезает. Вся форма прыгает туда-сюда. Кошмар.
Оставлен 30 Октябрь 2009 в 01:20 ¶А заманчивая тема;-)
Да, scheduler как минимум нужно написать. В eventlet, кстати, есть несколько реализаций, в том числе и адаптер к реактору из Twisted.
Учту. Это новая экспериментальная верстка:-)
Оставлен 30 Октябрь 2009 в 01:59 ¶А можете вспомнить как реализовывали и что не получилось?
Оставлен 31 Октябрь 2009 в 00:08 ¶Связка сервер + ДБ бекэнд (и возможно upload handler) для Джанги. Асинхронные!!!111
Оставлен 31 Октябрь 2009 в 00:09 ¶О, эта идея запала в душу многим. Времени правда пока нет, на данный момент скрестил слона с ужом - использую URL диспетчеризацию от Django в Twisted. А вот до ORM-а руки еще не дошли - дольше его делать, чем задаче работы с БД нужно.
Оставлен 02 Ноябрь 2009 в 17:45 ¶Оставьте комментарий