我试图理解python async / await并使用Future
对象来指示函数可以继续。这是一些代码,可重现我遇到的问题:
import time, threading, asyncio
loop = asyncio.get_event_loop()
f = loop.create_future()
def resolve(fut):
for i in range(3):
print(i)
time.sleep(1)
fut.set_result(88)
async def wait_on_future(fut):
print('waiting for fut')
await fut
print('done', fut.result())
return fut.result()
threading.Thread(target=resolve, args=(f,)).start()
loop.create_task(wait_on_future(f))
loop.run_forever()
打印:
0
waiting for fut
1
2
请注意,它永远不会打印'done'
。在文档的awaitables部分中,内容为:
等待Future对象时,它意味着协程将等待,直到Future在其他地方解析。
我认为调用set_result
是解决Future
的方法。我在这里想念什么?
注意:如果我在同一线程中调用resolve,则可以正常工作。我要解决的实际问题是解决Future
的事件在线程中。我确实注意到Future文档说它不是线程安全的。您如何制作一个异步函数来等待另一个线程中发生的事件?
答案 0 :(得分:0)
好吧,感谢@CharmingRobot对run_coroutine_threadsafe
的评论,我得出了以下解决方案:
import time, threading, asyncio
loop = asyncio.get_event_loop()
f = loop.create_future()
def resolve(fut):
for i in range(3):
print(i)
time.sleep(1)
async def a_resolve():
fut.set_result(88)
asyncio.run_coroutine_threadsafe(a_resolve(), loop)
async def wait_on_future(fut):
print('waiting for fut')
return await fut
async def print_future():
print('got the future! value:', await wait_on_future(f))
loop.create_task(print_future())
threading.Thread(target=resolve, args=(f,)).start()
loop.run_forever()
打印:
0
waiting for fut
1
2
got the future! value: 88
这就是我想要的。