2012-05-30 1 views
3

Позвольте сказать, что у меня есть событие(), и есть число X зелий, ожидающих события. Когда все эти зеленые зелени сделаны, я хочу сделать публикацию()gevent control greenlets с событиями

Как узнать, когда публиковать?

схематичное:

event.set() -> X number event.wait() -> finally publish the current state. 

Как я могу убедиться, что все greenlets, которые ждут() сделаны прежде, чем я делаю публиковать?

Я думаю, что положить все ожидающие зеленых в группу и сделать group.join() может работать.

import gevent 
from gevent.pool import Group 
from gevent.event import Event 
import random 

incoming = Event() 

group = Group() 

def test_wait(x): 
    gevent.sleep(random.random() * 3) 
    print 'test %s' % (x) 

def publish(): 
    print 'published' 


for x in range(int(random.random() * 20)): 
    group.spawn(test_wait, x) 


def event_setter(): 
    incoming.set() 
    gevent.sleep(0)                              
    publish() 


event_setter() 

Gevent.sleep (0) работает, если нет сна в test_wait. Как я могу быть уверен, что все зеленые зелени закончились?

ответ

3

Вы можете поместить все зеленые в список и позвонить по телефону gevent.joinall(your_greenlets). documentation немного запасен, но есть example.

0

Если вы используете group.join() вместо gevent.sleep (0) в event_setter(), вы можете увидеть желаемый результат, например:

Group size: 10 
test 6 
test 9 
test 3 
test 7 
test 1 
test 4 
test 0 
test 5 
test 2 
test 8 
published 

"Размер группы: 10" печатается строка: print "Размер группы:% d"% (len (группа),)