我有一个代码:
import asyncio as aio
async def coro(future: aio.Future):
print('Coro start')
await aio.sleep(3)
print('Coro finish')
future.set_result('coro result')
async def main():
future = aio.Future()
aio.create_task(coro(future))
await future
coro_result = future.result()
print(coro_result)
aio.run(main())
在
main()
中,我创建一个空的 aio.Future 对象,然后使用采用 aio.Future 对象的协程,使用 aio.create_task(coro(future))
创建一个任务。然后我用await future
“运行”空虚的未来。不知何故,这一行运行任务而不是运行空协程!我不明白它是如何工作的以及为什么会这样,因为我希望 await future
行运行空的 future,而不是任务!
如果我像这样重新组织我的
main()
:
import asyncio as aio
async def coro(future: aio.Future):
print('Coro start')
await aio.sleep(3)
print('Coro finish')
future.set_result('coro result')
async def main():
future = aio.Future()
await aio.create_task(coro(future))
# await future
coro_result = future.result()
print(coro_result)
aio.run(main())
我得到了相同的结果,但代码行为对我来说变得更加明确。
我觉得人们对未来是什么以及它如何运作存在误解, 所以简单来说,future 是一个对象,它的结果尚不可用,并将在将来设置(从名称上显而易见),它主要通过其他函数等在 Asnycio 内部使用,但我们可以在外部使用 futures也是如此。
它几乎是一个占位符,我们可以将其设置为结果/值或异常,并且在您创建任务并且它“填充”未来的情况下,这就是它的重点,以便填充未来.
下面通过代码的方式更好的解释这个概念:
async def main():
future = aio.Future()
aio.create_task(coro(future)) # Creating a task that will set the result of 'future'
await future # This will "block" until 'future' gets a result or exception
coro_result = future.result() # Retrieves the result of 'future' once it's set
print(coro_result)
希望这有帮助:)