Python事件循环w / gevent

时间:2015-10-04 17:59:59

标签: python gevent

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之前启动

  • 是否存在异步启动/生成gevent的事情(为什么一旦调用spawn就立即启动它)?
  • 是否有select / epoll运行greenlets以查看哪一个需要加入而不是joinall()

3 个答案:

答案 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。