使用任务队列有助于松耦合的设计。有时我们不得不重启服务(比如发新版),但不能打断队列中正在进行的任务。
正确的做法是handle sigterm信号,具体代码如下:
import sys
import argparse
import logging
import signal
import asyncio
class GracefulKiller:
kill_now = False
def __init__(self):
signal.signal(signal.SIGINT, self.exit_gracefully)
signal.signal(signal.SIGTERM, self.exit_gracefully)
def exit_gracefully(self,signum, frame):
self.kill_now = True
async def loop_task():
killer = GracefulKiller()
while 1:
print("ha") # 任务主体
if killer.kill_now:
break
await asyncio.sleep(2)
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(loop_task())
finally:
loop.run_until_complete(loop.shutdown_asyncgens()) # see: https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.AbstractEventLoop.shutdown_asyncgens
loop.close()
上面的程序,无论何时重启,都将等待所有后台的任务完成。妈妈再也不用担心我被用户投诉然后被祭天了。