問題現象
uwsgi 會根據配置啟用復數個進程的django
而 APScheduler 也會依附於 django 的啟動同時啟動
因此在每個 APScheduler 的定時任務也會是復數個同時執行
問題處理
占用一個未用端口, 從而保證其他django啟動的時候去檢測
如果已被占用則不在啟動, 從而實現用端口鎖,
保證只會啟用一個 APScheduler 進程
try:
# 利用一個占用端口來檢測是否已經啟動, 如已占用則說明已啟動
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("127.0.0.1", 44444))
except socket.error:
print("!!!scheduler started, DO NOTHING")
else:
try:
if settings.SYNC_TASK_TOOGLE == 'true':
print('scheduler running !!!')
scheduler.start()
else:
print('No need scheduler')
except Exception as e:
# 一般是沒生成表,就啟動當前程序就會報錯
print(e)
啟用后。 其他進程在啟動時將不會重復開啟 APScheduler
資料參考
https://github.com/viniciuschiele/flask-apscheduler/issues/79