2015-10-04 139 views
1
import gevent 
from gevent.event import AsyncResult 
import time 

class Job(object): 
    def __init__(self, name): 
     self.name = name 

def setter(job): 
    print 'starting' 
    gevent.sleep(3) 
    job.result.set('%s done' % job.name) 

def waiter(job): 
    print job.result.get() 


# event loop 
running = [] 
for i in range(5): 
    print 'creating' 
    j = Job(i) 
    j.result = AsyncResult() 
    running.append(gevent.spawn(setter, j)) 
    running.append(gevent.spawn(waiter, j)) 

print 'started greenlets, event loop go do something else' 
time.sleep(5) 
gevent.joinall(running) 

GEVENT犯規真正開始,直到joinall被稱爲Python的事件循環瓦特/ GEVENT

  • 有一些會異步啓動/產卵GEVENT(它爲什麼不盡快菌種被稱爲馬上開始)?
  • 是否有select/epoll在運行greenlet上查看哪一個需要加入而不是joinall()

回答

1

不,它不會馬上開始。一旦你的主greenlet進入hub(例如通過調用睡眠或加入來釋放控制權),它就會啓動。

顯然你的意圖是它在你撥打time時開始。它沒有,因爲你沒有猴子修補它。

這些行添加到文件的頂部:

from gevent import monkey 
monkey.patch_all() 

這一操作將有你想要的(因爲在引擎蓋下,time將被修改以產生到集線器)的行爲。您也可以撥打gevent.sleep

0

由於您沒有猴子補丁,time.sleep()導致您的應用暫停。改爲使用gevent.sleep(5)。