我正在研究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]))
答案 0 :(得分:0)
我的问题是因为使用sure_future它已经开始执行任务,并且如果执行了此操作
是的,ensure_future
一旦事件循环恢复就开始执行协程,即使没有人await
返回了未来。
ensure_future
的此功能来自实现,但从概念上讲也是有意义的。
在实现级别上,当给定协程对象时,这是ensure_future
internally calling create_task
的结果。换句话说,对于协程,loop.create_task
和asyncio.ensure_future
之间没有区别。否则,区别在于ensure_future
更通用:它接受任何awaitable对象,并将其转换为Future
。如果收到协程对象,则create_task
执行适当的转换,并返回新的Task
(本身是Future
的子类)。如果ensure_future
的参数已经是Future
或其子类,则返回原样。
在概念级别上,ensure_future
返回表示计算的“未来”值的对象,即,它封装了发生在后台的执行结果。如果是例程,则在后台运行意味着通过事件循环进行调度。如果不确保协程的执行力,则返回Future
会产生误导,因为这种未来永远不会到来。