Выполните некоторые действия на KeyboardInterrupt перед выходом из сельдерея - PullRequest
1 голос
/ 03 марта 2020

Есть ли способ выполнить некоторые операции перед выходом из сельдерея при обнаружении прерывания клавиатуры (скажем, SIGINT)? Я пытался использовать модуль сигналов в своих задачах так:

signal.signal(signal.SIGINT, keyboard_interrupt_handler)

Но он не работает так, как я ожидаю. keyboard_interrupt_handler действительно выполняется, но поскольку выполнение занимает несколько секунд, процесс завершается, прежде чем он может завершить выполнение sh.

Я также попытался временно заблокировать сигнал SIGINT с помощью signal.pthread_sigmask и запускает обработчик в потоке (поскольку их нельзя убить?), Но он сталкивается с той же проблемой.

Есть ли способ достичь чего-то подобного?

1 Ответ

0 голосов
/ 03 марта 2020

Я предлагаю вам попробовать реализовать обработчик для сигнала рабочего отключения . В общем, сигналы сельдерея чрезвычайно полезны, и пользователи Celery должны ознакомиться с ними, события Celery тоже.

Пример кода:

app = Celery('my_tasks', include['my_tasks.tasks', 'their_tasks.tasks'])

@worker_shutdown.connect
def handle_worker_shutdown(**kwargs):
    mymodule.handle_worker_shutdown(app, _LOGGER, **kwargs)
...