Asyncio future,运行 Future 对象

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

我有一个代码:

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())

我得到了相同的结果,但代码行为对我来说变得更加明确。

python python-asyncio coroutine
1个回答
0
投票

我觉得人们对未来是什么以及它如何运作存在误解, 所以简单来说,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)

希望这有帮助:)

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