3

假设我有一个 Event() 进来,并且有 X 数量的 greenlets 等待该事件。当那些等待的greenlets完成后,我想做一个 Publish()

我怎么知道什么时候发布?

示意图:

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

如何确保在发布之前完成所有等待()的greenlet?

我认为将所有等待的 greenlets 放在一个 Group 中并做一个 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()

如果 test_wait 中没有睡眠,则 Gevent.sleep(0) 有效。我怎么能确定所有等待的greenlets都结束了?

4

2 回答 2

3

您可以将所有 greenlets 放入一个列表并调用gevent.joinall(your_greenlets). 文档有点多余,但有一个例子

于 2012-05-30T08:25:25.267 回答
0

如果在 event_setter() 中使用 group.join() 而不是 gevent.sleep(0),则可以看到所需的结果,如下所示:

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”:打印“组大小:%d”%(len(group),)

于 2012-06-02T01:34:52.277 回答