await似乎阻止了asyncio.Future

问题描述 投票:2回答:1

我正在尝试理解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文档说它不是线程安全的。如何创建一个异步函数来等待另一个线程中发生的事件?

python-3.x async-await future
1个回答
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

这就是我要找的东西。

© www.soinside.com 2019 - 2024. All rights reserved.