发现问题
之前基于apscheduler创建了一个定时任务服务,并通过docker打包部署。
后来发现,关闭/重启该服务的时候总要等一会儿,调查发现是因为我们的容器不支持优雅退出,docker发现无法正常退出后,等待一段时间(比如10秒)后强杀容器。
解决思路
我们关闭容器的时候,比如执行 docker stop myservice
命令后,docker会给myservice容器的root进程发送一个SIGTERM
信号,而apscheduler默认不会处理这个信号。
所以,要想优雅退出,我们就需要自己处理docker发过来的SIGTERM
信号。
代码示例
import signal
from apscheduler.schedulers.blocking import BlockingScheduler
def exit_gracefully(signum, frame):
print('shutdown scheduler')
scheduler.shutdown()
if __name__ == "__main__":
scheduler = BlockingScheduler()
scheduler.add_job(xxx_task, 'interval', hours=1, max_instances=1)
signal.signal(signal.SIGTERM, exit_gracefully)
scheduler.start()
关键点就在于,倒数第二行的signal.signal(signal.SIGTERM, exit_gracefully)
,在启动scheduler前,监听了SIGTERM
信号。