Проблема заключается в неправильном использовании await asyncio.wait([current_time(), balance_check(),])
.
Ожидание asyncio.wait()
ожидает указанных ожидаемых значений до complete , то есть либо возвращает значение, либо вызывает исключение. Поскольку ни current_time
, ни balance_check
никогда не возвращаются из своих бесконечных циклов, выполнение main()
никогда не будет передано await asyncio.wait(...)
, так как это выражение ожидает завершения обоих. В свою очередь, цикл while
в main()
никогда не достигает своей второй итерации, и loop.stop()
не имеет шансов на запуск.
Если код намеревался использовать asyncio.wait()
, чтобы дать сопрограммам шансдля запуска, asyncio.wait
не является инструментом для этого. Вместо этого можно просто запустить две задачи, вызвав asyncio.create_task()
, а затем ничего не делать . Пока цикл событий может работать (то есть он не блокируется вызовом time.sleep()
или подобным), asyncio будет автоматически переключаться между сопрограммами, в этом случае current_time
и balanced_check
с их скоростью ~ 1 миллисекунды. Конечно, вы захотите восстановить контроль к крайнему сроку end_time
, поэтому «бездействие» лучше всего выражать одним вызовом asyncio.sleep()
:
async def main():
t1 = asyncio.create_task(current_time())
t2 = asyncio.create_task(balance_check())
end = dt.datetime.combine(dt.date.today(), end_time)
now = dt.datetime.now()
await asyncio.sleep((end - now).total_seconds())
print('loop stopped since {} is outside {} and {}'.format(now, start_time, end_time))
t1.cancel()
t2.cancel()
Обратите внимание, что явный loop.stop()
даже не обязательно, потому что run_until_complete()
автоматически остановит цикл после завершения данной сопрограммы. Вызов cancel()
для задач не имеет практического эффекта, потому что цикл останавливается практически сразу;он включен для выполнения этих задач, чтобы сборщик мусора не предупреждал об уничтожении ожидающих выполнения задач.
Как отмечено в комментариях, этот код не ожидает start_time
, нофункциональность легко достигается добавлением еще одного спящего режима перед порождением задач.