Является ли 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())
.