asyncio
函数让我有点困惑。我看到有一个BaseEventLoop.create_task(coro)
函数调度协程。文档中说create_task
是新函数,为了兼容性,我们应该使用asyncio.async(coro)
。再次参考文档,我发现它是asyncio.ensure_future(coro)
的别名,后者也可以调度协程。
与此同时,我一直在使用Task(coro)
来调度协程执行,这个方法也运行良好。那么,所有这些之间有什么区别呢?
asyncio
函数让我有点困惑。我看到有一个BaseEventLoop.create_task(coro)
函数调度协程。文档中说create_task
是新函数,为了兼容性,我们应该使用asyncio.async(coro)
。再次参考文档,我发现它是asyncio.ensure_future(coro)
的别名,后者也可以调度协程。
与此同时,我一直在使用Task(coro)
来调度协程执行,这个方法也运行良好。那么,所有这些之间有什么区别呢?
Future
是一个对象,它应该在未来拥有结果。
更正式地说:
Future
是一个awaitable
对象,表示异步操作的最终结果。
如果一个对象可以在
await
表达式中使用,则该对象是awaitable
。
因此,任何Future
都可以被await
。
Tasks
用于同时调度协程。当将协程包装到像
asyncio.create_task()
这样的函数中时,协程会自动安排在近期运行。
实际上,Task就是一个Future:
运行Python协程的类似
Future
的对象。
Task
是Future
的子类。
asyncio.Task
从Future
继承了除了Future.set_result()
和Future.set_exception()
之外的所有API。
将
coro
协程包装到一个Task
中并安排其执行。返回Task
对象。
它确保obj
是一个Future
。如果不是,则从obj
创建一个Task
。就这样。
obj
已经是一个Future
,ensure_future
将返回相同的obj
。在这种情况下,函数的返回值可能是Future而不是Task,因为Task
只是Future
的子类。ensure_future
,你可以这样做:# will create a Task
task = asyncio.ensure_future(coroutine())
# will ensure that it is a Task
task = asyncio.ensure_future(task)
# will create a Task
task = asyncio.create_task(coroutine())
# will ensure that it is a Task
task = asyncio.ensure_future(task)
因此,您可以在Task
上调用ensure_future
。但是您不能对create_task
这样做:
# will create a Task
task = asyncio.create_task(coroutine())
# will raise an exception
task = asyncio.create_task(task)
create_task()
是创建新的Tasks
的首选方式。
自版本3.10起已弃用:如果obj不是类似于Future的对象,loop未指定且没有运行的事件循环,则会发出弃用警告。
ensure_future
。谢谢你澄清了这个问题。 - Elektito