Гринлеты

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

  1. CordiS написал:

    Не помню точно почему, но "потусторонний call/cc" на гринлетах у меня не вышел пару-тройку лет назад. зато со стеклесом вышло весьма забавно.

    Оставлен 29 Октябрь 2009 в 10:16
  2. astur написал:

    А что за идея то?... которая родилась где применить...

    Оставлен 29 Октябрь 2009 в 10:55
  3. Alexander Artemenko написал:

    Что за идея?

    Оставлен 29 Октябрь 2009 в 11:12
  4. Сергей Шепелев написал:

    О боже, Александр, спасибо за развязку. Честно, я начал читать и сердце замерло; думаю, щас будет обсирать асинхронные вебсервера, скажет, что все должны хотеть только джангу под апачем. Серьёзно, спасибо, что не так.

    Ещё, я хотел бы уточнить, как пишут на сайте проекта, что она позволяет именно делать легкие потоки. greenlet это не легкие потоки из коробки. Вот тебе пришлось написать несколько строчек для этого. Приятная сторона в том, что greenlet позволяет делать не только лёгкие потоки. Но как раз это, с намёком на call/cc, ты уже упомянул.

    P.S.: в хроме под виндой ввод комментария жутко скачет, потому что под словом "Предпросмотр" появляется новый параграф с тремя точками (зачем?), а через пару секунд исчезает. Вся форма прыгает туда-сюда. Кошмар.

    Оставлен 30 Октябрь 2009 в 01:20
  5. Александр Кошелев написал:

    Честно, я начал читать и сердце замерло; думаю, щас будет обсирать асинхронные вебсервера, скажет, что все должны хотеть только джангу под апачем.

    А заманчивая тема;-)

    Ещё, я хотел бы уточнить, как пишут на сайте проекта, что она позволяет именно делать легкие потоки. greenlet это не легкие потоки из коробки. Вот тебе пришлось написать несколько строчек для этого.

    Да, scheduler как минимум нужно написать. В eventlet, кстати, есть несколько реализаций, в том числе и адаптер к реактору из Twisted.

    P.S.: в хроме под виндой ввод комментария жутко скачет, потому что под словом "Предпросмотр" появляется новый параграф с тремя точками (зачем?), а через пару секунд исчезает. Вся форма прыгает туда-сюда. Кошмар.

    Учту. Это новая экспериментальная верстка:-)

    Оставлен 30 Октябрь 2009 в 01:59
  6. Александр Кошелев написал:

    Не помню точно почему, но "потусторонний call/cc" на гринлетах у меня не вышел пару-тройку лет назад. зато со стеклесом вышло весьма забавно.

    А можете вспомнить как реализовывали и что не получилось?

    Оставлен 31 Октябрь 2009 в 00:08
  7. Александр Кошелев написал:

    А что за идея то?... которая родилась где применить...

    Что за идея?

    Связка сервер + ДБ бекэнд (и возможно upload handler) для Джанги. Асинхронные!!!111

    Оставлен 31 Октябрь 2009 в 00:09
  8. http://deepwalker.blogspot.com/ написал:

    О, эта идея запала в душу многим. Времени правда пока нет, на данный момент скрестил слона с ужом - использую URL диспетчеризацию от Django в Twisted. А вот до ORM-а руки еще не дошли - дольше его делать, чем задаче работы с БД нужно.

    Оставлен 02 Ноябрь 2009 в 17:45