我正在阅读Python文档和PyMotW书籍,试图学习Async/Await、Futures和Tasks。
通常在应用程序级别的代码中没有必要创建Future对象。
从future文档中可以得知:
loop.create_future()
创建一个附加到事件循环的asyncio.Future对象。
这是在asyncio中创建Future的首选方法。这让第三方事件循环提供了替代实现Future对象(具有更好的性能或仪表化)的可能性。
然而,在PyMotW Future章节中,作者像这样创建了一个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
对象的方式吗?
all_done = asyncio.Future()
?作者运行一个错误跟踪器,所以我们可以告诉他在 Python 3.7 中该行已经更改。 - user10597450create_future
事件循环方法是在Python 3.5.2中引入的,因此它并不是3.7的新功能。指南中更严重的问题是,在现代异步编程中,创建和操作原始future被认为是不好的风格。几乎所有使用x.add_done_callback(foo)
的示例都可以通过将其表达为协程来受益,该协程等待x
然后执行foo
。 - user4815162342