Python 3.x 等待似乎阻碍了asycio的未来

Python 3.x 等待似乎阻碍了asycio的未来,python-3.x,async-await,future,Python 3.x,Async Await,Future,我试图理解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

我试图理解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
0
waiting for fut
1
2
got the future! value: 88
请注意,它从不打印
“完成”
。在文件部分,它说:

当一个未来的对象被等待时,这意味着协程将等待直到未来在其他地方被解决

我认为调用
set\u result
是解决
未来问题的方法。我错过了什么


注意:如果我在同一个线程中调用resolve,这就可以了。我试图解决的实际问题是,解决
未来问题的事件在线程中。我注意到文档中说它不是线程安全的。如何使异步函数等待另一个线程中发生的事件?

好的,多亏@CharmingRobot对
运行\u coroutine\u 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
0
waiting for fut
1
2
got the future! value: 88

这就是我想要的。

“>我注意到未来的文档说它不是线程安全的。”大多数asyncio都不是线程安全的。同时使用异步IO和线程通常没有意义。你尝试使用多重处理来代替吗?@ ChanMixOutlook线程是用Cython包装的C++代码生成的。我试图使用这些线程触发的回调来解析某些异步代码中的未来。我熟悉多重处理;这无助于解决此问题,但感谢您的思考。您是否查看了
run\u in\u executor
asyncio函数?也许您可以在协同程序中调用'wait run\u in\u executor(resolve(f))?另外,如果您想在不同的线程上调度协同程序,您可以使用
asyncio.run\u coroutine\u threadsafe
@CharmingRobot我认为
run\u coroutine\u threadsafe
可能适合我,谢谢链接!