2012-11-27 5 views
0

두 개의 다른 연결에서 데이터를 수신하는 두 가지 기능이 있습니다. 그 중 하나에서 결과를 얻은 후에 두 연결을 닫아야합니다. lst에서 두 개의 greenlets 준비까지여러 개의 greenlets 중 하나가 완료 될 때까지 기다려주십시오

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

gevent.joinall 현재 블록 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' 

는 그때 각 기능 스폰.

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 모든 값의 목록을해야합니다

자동차