Изящно выход из задания APScheduler - PullRequest
0 голосов
/ 22 апреля 2020

Можно ли корректно завершить работу при использовании ProcessPoolExecutor? Я попытался добавить обработчик сигнала, но он, похоже, не перехватывает SIGTERM.

from datetime import datetime
import os
import signal
import time

from apscheduler.schedulers.blocking import BlockingScheduler


def tick():
    print('Tick! The time is: %s' % datetime.now())


def sig_handler(signum, frame):
    print('Caught signal!')


def ticks():
    signal.signal(signal.SIGTERM, sig_handler)
    for i in range(10):
        tick()
        time.sleep(1)


if __name__ == '__main__':
    scheduler = BlockingScheduler()
    scheduler.add_executor('processpool')
    scheduler.add_job(tick, 'interval', seconds=3)
    print('PID: {}'.format(os.getpid()))
    print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C'))

    try:
        scheduler.start()
    except (KeyboardInterrupt, SystemExit):
        pass

    print('Exiting')
...