【问题标题】:Python Event loop w/ gevent带有 gevent 的 Python 事件循环
【发布时间】:2016-01-01 09:36:26
【问题描述】:
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 时立即启动)?
  • 在运行greenlets 时是否有select/epoll 来查看需要加入哪个而不是joinall()

【问题讨论】:

    标签: python gevent


    【解决方案1】:

    不,它不会立即开始。它会在您的主greenlet 屈服于集线器后立即启动(例如,通过调用 sleep 或 join 来释放控制)

    很明显,您的意图是在您致电time 时开始。它没有,因为你没有猴子修补它。

    将这些行添加到文件的最顶部:

    from gevent import monkey
    monkey.patch_all()
    

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

    您也可以致电gevent.sleep

    【讨论】:

      【解决方案2】:

      由于您没有打补丁,time.sleep() 会导致您的应用暂停。请改用 gevent.sleep(5)。

      【讨论】:

        【解决方案3】:

        第一步应该是猴子补丁

        from gevent import monkey; 
        monkey.patch_all()
        

        这将异步生成greenlets。

        【讨论】:

          猜你喜欢
          • 2017-07-07
          • 2017-07-11
          • 1970-01-01
          • 2020-11-01
          • 2012-05-27
          • 1970-01-01
          • 2018-12-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多