Как создать вызываемую асинхронную функцию с возможностью асинхронного предварительного завершения?
Суть такова. У меня существует задача - с задержкой на выполнение. А также есть исход, в котором за время этой задержки данная функция завершается, не выполнившись до конца. Н-р идёт запрос, на ответ даётся 2 минуты, если пользователь за две минуты отвечает, то функция не выполняет свой исход, если же не отвечает, то проходит исход по завершению действий.
К сожалению, данные способы с Task я пробовал, пока выполняется одна асинхронная функция, другая не может вмешаться в её действия (не может её завершить). А wait_for() не нужен, он не для этого. А так спасибо, в десятый раз прочитал документацию
другая не может вмешаться в её действия (не может её завершить)
Не знаю, как ты читал, потому что как раз завершить можно. Тебе create_task() возвращает объект класса Task. У него есть метод cancel(), который принудительно завершает выполняемую корутину.
Технически это реализуется через выброс исключения asyncio.CancelledError внутри выполняемого в настоящий момент await вызова внутри функции.
Собственно, wait_for() как раз и канселит Task таким образом при таймауте.
Так что если у тебя корутина нормальная, и большую часть своего времени висит в await-вызовах, то cancel() должен замечательно её остановить. Вот если это синхронный вызов, завёрнутый в корутину через run_in_executor(), тогда другой разговор...