Python sanic AsyncIOScheduler 的单例模式
sanic 是个异步框架。可以配置多个worker ,执行定时任务时,也会执行多遍。期望通过单例模式,确保只运行一次。
解决思路。AsyncIOScheduler函数有没有自带的单例模式,答案无。网上有没有相关做法,搜集半天,没有太好的办法。试过全局变量,协程共享变量等,均无效。试着用进程的共享变量来解决协程的冲突,有点杀鸡用牛刀。但是能杀,那就用吧。
代码如下。
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from multiprocessing import Value
import asyncio
scheduler_count = Value("i",1)
lock = asyncio.Lock()
@app.after_server_start
async def setup_scheduler(app):
async with lock:
if scheduler_count.value > 0:
scheduler_count.value -= 1
scheduler = AsyncIOScheduler()
scheduler.start()