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
之前启动
select
/ epoll运行greenlets以查看哪一个需要加入而不是joinall()
? 答案 0 :(得分:1)
不,它不会马上开始。它会在您的主要greenlet产生到集线器时启动(通过调用sleep或join来释放控制权)
显然,您打算在致电time
时开始。它没有,因为你没有猴子修补它。
将这些行添加到文件的最顶部:
from gevent import monkey
monkey.patch_all()
这将具有您想要的行为(因为在引擎盖下,time
将被修改为屈服于集线器。)
或者,您可以拨打gevent.sleep
。
答案 1 :(得分:0)
由于你没有使用补丁,time.sleep()会导致你的应用暂停。请改用gevent.sleep(5)。
答案 2 :(得分:0)
第一步应该是猴子补丁
from gevent import monkey;
monkey.patch_all()
这将异步生成greenlets。