Python 事件循环 w/gevent

标签 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) 

在调用 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/

相关文章:

python - Gevent joinall 阻塞错误

python - centos 7.2 python 2.7.5 WSGIServer 无法传递 key 文件参数

python - 在windows下安装gevent

python - 等待 gevent socket 和 redis 阻塞 blpop

python - 什么是 gevent.queue.Channel?

python - tkinter Canvas 保持最小化

python - 在 map 上叠加散点图(img)

python - Pandas 多索引数据帧: replace certain values by values from other column on 2nd level

python - Matplotlib:如何添加图例以散点图颜色?

python - 循环具有不同名称的列