python - Gevent 获取第一个结果以完成
问题描述
我目前有一些代码向主要的主要数据库集发出请求。每个请求可能需要超过超时时间。我想阅读第一个完成的结果并决定是否等待第二个。代码看起来像这样:
GREENLET_TIMEOUT = 1 # Seconds
greenlet_a = gevent.spawn(start_request, redis_a)
greenlet_b = gevent.spawn(start_request, redis_b)
gevent.joinall([greenlet_a, greenlet_b], timeout=GREENLET_TIMEOUT)
result_a = greenlet_a.value
result_b = greenlet_b.value
我在这里看到了一个类似的帖子, 我尝试按照这里的建议进行操作:
import time
import gevent
from gevent.event import Event
def first():
time.sleep(1)
return
def second():
time.sleep(5)
return
event = gevent.event.Event()
event.clear()
def callback(value):
event.set()
lst = [gevent.spawn(first), gevent.spawn(second)]
for g in lst:
g.link(callback)
start_time = time.time()
res = event.wait()
print("--- %s seconds ---" % (time.time() - start_time))
print(res)
我希望它需要 1 秒多一点的时间然后返回,但显然是在等待两者完成。
我还尝试了另一种使用 AsyncResult 的方法
import time
import gevent
from gevent.event import AsyncResult
result = AsyncResult()
def first():
result.set(1)
def second():
time.sleep(5)
result.set(2)
first_event = gevent.spawn(first)
second_event = gevent.spawn(second)
res = result.get()
print(res)
任何帮助,将不胜感激!
解决方案
我错过了猴子补丁部分。这按预期工作!
import time
import gevent
from gevent.event import AsyncResult
from gevent import monkey
monkey.patch_all(subprocess=True)
result = AsyncResult()
def first():
result.set(1)
def second():
time.sleep(5)
result.set(2)
first_event = gevent.spawn(first)
second_event = gevent.spawn(second)
res = result.get()
print(res)
推荐阅读
- mysql - 选择第一次失败并在下一次尝试中成功的客户
- php - 将mysql查询转移到php
- c# - 如何在 Web.Api 中添加多个路由
- android - 我现在使用了 recylerview,我想在单击任何 recylerview 项目时,然后在全屏上弹出一个片段
- python - 从一个文件写入另一个文件
- arrays - 通过比较它们的字节数组来比较 VB.NET 中的两个图像是否有效?
- c++ - 错误 MSB3073 .... 以代码 8 退出
- python - 如果方法为真或假,如何打印消息
- html - 具有固定第一行和第一列的可滚动 html 表格,以及表格单元格内的角度材料控件
- vba - 递归函数返回空字符串