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)
在调用 joinall
之前,gevent 并未真正启动
- 是否有一些东西可以异步启动/生成 gevent(为什么它不会在调用 spawn 后立即启动)?
- 运行 greenlet 时是否有一个
select
/epoll 来查看需要加入哪一个而不是joinall()
?
最佳答案
不,它不会立即开始。一旦您的主 greenlet 屈服于集线器(例如通过调用 sleep 或 join 释放控制),它将立即启动
显然,您的意图是当您调用 time
时它就会开始。它没有,因为你还没有猴子修补它。
将这些行添加到文件的最顶部:
from gevent import monkey
monkey.patch_all()
这将具有您想要的行为(因为在幕后,时间
将被修改以屈服于集线器)。
或者,您可以调用gevent.sleep
。
关于Python 事件循环 w/gevent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32936584/