【发布时间】:2019-12-08 12:49:15
【问题描述】:
我正在将协程提交到单独线程中的事件循环。当我用future.next() 依次等待每个未来时,这一切都很好。但我现在想等待期货列表中第一个完成的未来。我正在尝试为此使用asyncio.wait(...),但我似乎使用不正确。
下面是一个简化的例子。我在done, pending = future.result() 行收到异常TypeError: An asyncio.Future, a coroutine or an awaitable is required。
如果我将[c1, c2, c3] 传递给asyncio.wait([c1, c2, c3], return_when=asyncio.FIRST_COMPLETE),这将有效,但我是在随机时间提交任务,所以我只能收集期货集合,而不是原始任务。并且文档明确指出您可以使用期货。
coroutine asyncio.wait(futures, *, loop=None, timeout=None, return_when=ALL_COMPLETED)等待序列futures给出的Futures和协程对象完成。协程将被包装在 Tasks 中。返回两组 Future: (done, pending)。
import asyncio
import threading
async def generate():
await asyncio.sleep(10)
return 'Hello'
def run_loop(loop):
asyncio.set_event_loop(loop)
loop.run_forever()
event_loop = asyncio.get_event_loop()
threading.Thread(target=lambda: run_loop(event_loop)).start()
c1 = generate() # submitted at a random time
c2 = generate() # submitted at a random time
c3 = generate() # submitted at a random time
f1 = asyncio.run_coroutine_threadsafe(c1, event_loop)
f2 = asyncio.run_coroutine_threadsafe(c2, event_loop)
f3 = asyncio.run_coroutine_threadsafe(c3, event_loop)
all_futures = [f1, f2, f3]
# I'm doing something wrong in these 3 lines
waitable = asyncio.wait(all_futures, return_when=asyncio.FIRST_COMPLETED)
future = asyncio.run_coroutine_threadsafe(waitable, event_loop)
done, pending = future.result() # This returns my TypeError exception
for d in done:
print(d.result())
【问题讨论】: