正确使用loop.create_future

我正在阅读Python文档和PyMotW书,试图学习异步/等待,期货和任务。

协程和任务文档:

通常,不需要在应用程序级别的代码中创建Future对象。

从将来的文档中,它指出以下内容:

loop.create_future()

创建一个附加到事件循环的asyncio.Future对象。

这是在asyncio中创建Future的首选方式。这样,第三方事件循环就可以提供Future对象的替代实现(具有更好的性能或手段)。

但是,在有关Future的PyMotW一章中,作者创建了一个future像这样的对象:

all_done = asyncio.Future()

我认为是因为本书略落后于当前版本的Python。为了解决这个问题,我做了以下工作:

future_Obj = event_loop.create_future()

因此,作者的完整代码变为:

import asyncio

def mark_done(future, result):

print('setting future result to {!r}'.format(result))

future.set_result(result)

event_loop = asyncio.get_event_loop()

try:

future_Obj = event_loop.create_future()

print('scheduling mark_done')

event_loop.call_soon(mark_done, future_Obj, 'the result')

print('entering event loop')

result = event_loop.run_until_complete(future_Obj)

print('returned result: {!r}'.format(result))

finally:

print('closing event loop')

event_loop.close()

print('future result: {!r}'.format(future_Obj.result()))

题:

是future_Obj = event_loop.create_future()上面的示例中,创建一个正确的方法future根据文档对象?

蟒蛇

回答:

future_Obj = event_loop.create_future()上面的示例中,根据文档创建一个未来目标的正确方法是什么?

是的,在所示的代码中,这正是这样做的方法。

需要注意的一件事是,将来与事件循环相关,因此在顶层创建将来会与asyncio.get_event_loop()最初返回的循环相关联。切换到后asyncio.run,您将收到错误消息,因为每次调用asyncio.run都会创建一个新的事件循环。

为避免该问题,None可以在global适当的时候在协程中创建高层的未来并在协程中创建。而且,由于您明确地过了未来(这是一个很好的做法),因此根本不需要全局变量:

def mark_done(future, result):

print('setting future result to {!r}'.format(result))

future.set_result(result)

async def main():

loop = asyncio.get_event_loop()

future = loop.create_future()

print('scheduling mark_done')

loop.call_soon(mark_done, future, 'the result')

print('suspending the coroutine')

result = await future

print('awaited result: {!r}'.format(result))

print('future result: {!r}'.format(future.result()))

return result

if __name__ == '__main__':

print('entering the event loop')

result = asyncio.run(main())

print('returned result: {!r}'.format(result))

请注意,使用时asyncio.run,您无需显式关闭循环,这是自动完成的。如果您使用的是Python 3.6或更早版本,则可以替换asyncio.run(main())asyncio.get_event_loop().run_until_complete(main())

以上是 正确使用loop.create_future 的全部内容, 来源链接: utcz.com/qa/411854.html

回到顶部