2012-11-27 35 views
0

我有两个函数接收来自两个不同连接的数据,我应该在从其中一个连接获得结果后关闭两个连接。等到几个greenlet之一完成

def first(): 
    gevent.sleep(randint(1, 100)) # i don't know how much time it will work 
    return 'foo' 

def second(): 
    gevent.sleep(randint(1, 100)) # i don't know how much time it will work 
    return 'bar' 

然后我产卵的各功能:

lst = [gevent.spawn(first), gevent.spawn(second)] 

gevent.joinall块当前greenlet直到从lst两个2个greenlets准备。

gevent.joinall(lst) # wait much time 
print lst[0].get(block=False) # -> 'foo' 
print lst[1].get(block=False) # -> 'bar' 

我想等到eiter第一或第二greenlet准备就绪:

i_want_such_function(lst) # returns after few seconds 
print lst[0].get(block=False) # -> 'foo' because this greenlet is ready 
print lst[1].get(block=False) # -> raised Timeout because this greenlet is not ready 

我该怎么办呢?

回答

3

你可以使用gevent.event.Event(或AsyncResult)和Greenlet的链接()方法,像这样:

... 
ready = gevent.event.Event() 
ready.clear() 

def callback(): 
    ready.set() 

lst = [gevent.spawn(first), gevent.spawn(second)] 
for g in lst: 
    g.link(callback) 

ready.wait() 
... 
0

回调接收GEVENT子进程,你可以得到如返回值从它

... 

cars = [] 

def _callback(job): 
    cars.append(job.value) 

for car in xml_all_cars: 
    print "creating jobs" 
    g_parse = Greenlet.spawn(myMainFunction) 
    g_parse.start() 
    g_parse.link(_callback) 
    jobs.append(g_parse) 

print "starting all jobs" 
gevent.joinall(jobs) 
print "jobs done" 

return cars 

汽车将有myMainFunction返回所有值的列表(每车)