Вопрос:async def start(channel): while True: m = await client.send_message(channel, «Generating… «) generator.makeFile() with open(‘tmp.png’, ‘rb’) as f: await client.send_file(channel, f) await client.delete_message(m) await asyncio.sleep(2)
У меня есть битва, которая выполняет задачу каждые 2 секунды. Я попытался использовать для этого бесконечный цикл, но сценарий аварийно завершился, и Task was destroyed but it is still pending! Я читал о asyncio сопрограмм, но ни один из примеров, которые я нашел применение await в них. Можно ли избежать этой ошибки, например, запустив сопрограмму с await?
Лучший ответ:
Task was destroyed but it is still pending! это предупреждение, которое вы получаете при вызове loop.close() когда некоторые задачи в вашем скрипте не завершены. Обычно вам следует избегать этой ситуации, поскольку незавершенная задача может не выделять некоторые ресурсы. Вам нужно либо ждать выполнения задачи, либо отменить ее до закрытия цикла события.
Поскольку у вас бесконечный цикл, вам, вероятно, потребуется отменить задачу, например:
import asyncio from contextlib import suppress async def start(): # your infinite loop here, for example: while True: print(‘echo’) await asyncio.sleep(1) async def main(): task = asyncio.Task(start()) # let script some thime to work: await asyncio.sleep(3) # cancel task to avoid warning: task.cancel() with suppress(asyncio.CancelledError): await task # await for task cancellation loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) try: loop.run_until_complete(main()) finally: loop.run_until_complete(loop.shutdown_asyncgens()) loop.close()
См. Также этот ответ для получения дополнительной информации о задачах.