【问题标题】:Why does gevent.spawn not execute the parameterized function until a call to Greenlet.join?为什么 gevent.spawn 在调用 Greenlet.join 之前不执行参数化函数?
【发布时间】:2013-04-03 01:18:57
【问题描述】:

我想使用gevent 发出一个异步HTTP POST 请求——我不关心响应,我只想尽快执行请求。但是,每当我尝试使用gevent.spawn 执行此操作时,请求永远不会执行。我知道这一点是因为在从gevent.spawn 返回的Greenlet 上调用.ready().successful() 方法总是返回False

但是,Greenlet已经启动了,因为如果我调用glet = gevent.spawn(...),然后调用glet.start(),我会收到错误消息AssertionError: Greenlet already started

我唯一一次得到glet.ready() == True 是当我调用glet.join() 时,但这是一个阻塞操作。我怎样才能让 Greenlet 在不等待它完成的情况下执行?

【问题讨论】:

    标签: python asynchronous gevent


    【解决方案1】:

    由于greenlet 是合作的,因此您的新greenlet 不会运行,除非您屈服于它。调用 spawn 后,调用 gevent.sleep(0) 来让你的 greenlet 运行。

    它将继续运行,直到它做了一些导致它屈服的事情(比如启动那个 http req)。然后您的其他代码可以再次恢复。

    编辑:

    为了解决您关于 grequests 的问题,grequests.send() 文档说:

    send(r, pool=None, stream=False)
        Sends the request object using the specified pool. If a pool isn't
        specified this method blocks. Pools are useful because you can specify size
        and can hence limit concurrency
    

    由于您尚未指定池,因此请求会阻止您的 greenlet 完成。换句话说,一旦它返回,greenlet 就已经完成了。要获得响应,请参阅返回的 greenlet 的 glt.get()

    【讨论】:

    • 啊,这似乎行得通!但是,当我使用 grequests (github.com/kennethreitz/grequests) 库时,调用 grequests.send(grequests.request("POST", )) 会创建一个 Greenlet,但是即使在调用 gevent 之后这个 Greenlet 也不会执行。睡觉()。你知道这是为什么吗?
    猜你喜欢
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多