Весь смысл в ожидании сопрограммы, такой как h()
, заключается в ожидании его завершения и (где это имеет смысл) доступа к его возвращаемому значению. Например, line = await stream.readline()
приостанавливает текущую сопрограмму до завершения readline()
, а затем предоставляет результат для присвоения line
.
Если вы хотите, чтобы h()
работал в фоновом режиме, вы можете использовать asyncio.create_task
вместо. Но это все равно не приведет к желаемому результату, потому что run_until_complete(main())
ожидает только от main()
до конца sh, игнорируя дополнительные задачи, которые он мог породить. (Он также возвращает возвращаемое значение сопрограммы, очень похоже на syn c, эквивалентный await
.)
Если вы хотите дождаться дополнительных задач, вы должны быть явными об этом. Возможно что-то вроде:
async def main():
bgtasks = []
print("{}: start of program".format(datetime.now()))
bgtasks.append(asyncio.create_task(h()))
print("{}: end of program".format(datetime.now()))
return bgtasks
async def run_everything():
more_tasks = await main()
await asyncio.gather(*more_tasks)
if __name__ == '__main__':
asyncio.run(run_everything())