Примерно год назад, во время массовой истерии по поводу питонячих и не очень асинхронных серверов, я, пытаясь составить своё мнение обо всем об этом, набрел на интересную библиотеку - 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 из "других" языков.
Ещё тогда у меня родилась идея где это можно ...