首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python事件循环w/ gevent

Python事件循环w/ gevent
EN

Stack Overflow用户
提问于 2015-10-04 17:59:59
回答 3查看 1.4K关注 0票数 2
代码语言:javascript
复制
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 (为什么它不立即被调用)?
  • 是否在运行绿包时有一个select/epoll来查看哪一个需要加入而不是joinall()
EN

回答 3

Stack Overflow用户

发布于 2016-02-25 18:59:04

不,不是马上就开始的。它将在您的主绿地向集线器生成后立即启动(例如,通过调用睡眠或连接来释放控制)。

显然,您的意图是在调用time时开始。它没有,因为你没有猴子修补它。

将这些行添加到文件的最上面:

代码语言:javascript
复制
from gevent import monkey
monkey.patch_all()

然后,这将具有您想要的行为(因为在幕后,time将被修改以屈服于集线器)。

或者,您可以调用gevent.sleep

票数 2
EN

Stack Overflow用户

发布于 2018-03-07 23:27:16

由于没有猴子补丁,time.sleep()会导致应用程序暂停。使用gevent.sleep(5)代替。

票数 1
EN

Stack Overflow用户

发布于 2021-01-29 06:33:24

第一步应该是猴子的修补。

代码语言:javascript
复制
from gevent import monkey; 
monkey.patch_all()

这将异步地生成绿色产品。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32936584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档