Python AsyncIO Грациозное завершение работыPython

Программы на Python
Ответить
Anonymous
 Python AsyncIO Грациозное завершение работы

Сообщение Anonymous »

Сколько бы я ни искал (или, может быть, я ищу неправильно), я не могу найти достойного способа завершить свои задачи в Python AsyncIO.
Я знаю что:
- мне нужно привязываться к сигналам (, SIGTERM) с использованием цикла.add_signal_handler(signum, лямбда: asyncio.create_task(shutdown())) в Unix, signal.signal(signum, лямбда *args: Loop.call_soon_threadsafe(shutdown, args)) в Windows.
В выключенном состоянии:
- мне нужно получить все задачи (

Код: Выделить всё

asyncio.all_tasks()
), отмените их и подождите.
- Закройте соединение и выполните дополнительную очистку.
-loop.shutdown_asyncgens()
- Остановите цикл.
Проблема в том, что если я получу все задачи, это может повлиять, например, на задачи, используемые внутри библиотеки (например, aiokafka), а при ожидании отмены задач это может повлиять застревает в бесконечном ожидании.
Если я закрою соединение до того, как задачи будут завершены, это нормально, но проблема в том, что если я закрою соединение до того, как все задачи будут отменены, задачи не смогут корректно завершиться.
У меня следующие вопросы:
- Единственный ли вариант — вручную собрать все задачи и отменить их?
- И, например, если у меня есть TaskGroup, мне следует завершить ее конкретно или ее подзадачи?
- И, похоже, есть проблема с циклом.set_Exception_handler, который должен просто вызывать выключение, иначе задачи тоже могут зависнуть, я правильно понимаю?
Я также видел, что есть вариант с выключением_event, но я не думаю, что он подойдет, потому что если у меня есть задачи, которые используют await очередь.get(), они могут застрять.

Подробнее здесь: https://stackoverflow.com/questions/798 ... l-shutdown
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»