Python异步确保和未来

时间:2018-06-21 04:22:57

标签: python python-3.x python-asyncio

我正在研究Python的asyncio库,并且很难理解某些Python函数的工作原理。
例如:

import asyncio
async def coroutine():
    print('Initialize coroutine')
    await asyncio.sleep(1)
    print('Done !')

loop = asyncio.get_event_loop()
#asyncio.ensure_future(coroutine())
#loop.create_task(coroutine())
loop.run_forever()

例如在代码中,如果我使用suresure_future,它将自动开始执行我的任务,create_task也是如此,但是在创建任务的情况下,我什至理解它使用loop.create_task方法调用中使用的循环。我的问题是因为使用sure_future它已经开始执行任务,并且如果执行此操作是因为在某些情况下我看到这样的代码:

import asyncio
async def coroutine():
    print('Initialize coroutine')
    await asyncio.sleep(1)
    print('Done !')

loop = asyncio.get_event_loop()
task = asyncio.ensure_future(coroutine())
loop.run_until_complete(asyncio.wait([task]))

1 个答案:

答案 0 :(得分:0)

  

我的问题是因为使用sure_future它已经开始执行任务,并且如果执行了此操作

是的,ensure_future一旦事件循环恢复就开始执行协程,即使没有人await返回了未来。

ensure_future的此功能来自实现,但从概念上讲也是有意义的。

  • 在实现级别上,当给定协程对象时,这是ensure_future internally calling create_task的结果。换句话说,对于协程,loop.create_taskasyncio.ensure_future之间没有区别。否则,区别在于ensure_future更通用:它接受任何awaitable对象,并将其转换为Future。如果收到协程对象,则create_task执行适当的转换,并返回新的Task(本身是Future的子类)。如果ensure_future的参数已经是Future或其子类,则返回原样。

  • 在概念级别上,ensure_future返回表示计算的“未来”值的对象,即,它封装了发生在后台的执行结果。如果是例程,则在后台运行意味着通过事件循环进行调度。如果不确保协程的执行力,则返回Future会产生误导,因为这种未来永远不会到来。