在 Flask 项目中,需要做一些定时任务,因此 Flask-APScheduler 这定时任务库很适合在项目里使用。在本地开发的环境中,项目启动时是单进程,使用没有任何问题,当你部署到服务器上的时候,在多进程环境下,就会出现定时任务重复运行的问题。
通过文件锁来锁定定时任务的启动,该写法在 Linux、Window 环境下都能正常运行。
import atexit
from flask import Flask
def __scheduler_init(app):
scheduler = APScheduler()
if platform.system() != 'Windows':
# Linux 环境下
fcntl = __import__("fcntl")
f = open('scheduler.lock', 'wb')
try:
fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB)
scheduler.init_app(app)
scheduler.start()
except:
pass
def unlock():
fcntl.flock(f, fcntl.LOCK_UN)
f.close()
atexit.register(unlock)
else:
# Window 环境下
msvcrt = __import__('msvcrt')
f = open('scheduler.lock', 'wb')
try:
msvcrt.locking(f.fileno(), msvcrt.LK_NBLCK, 1)
scheduler.init_app(app)
scheduler.start()
except:
pass
def _unlock_file():
try:
f.seek(0)
msvcrt.locking(f.fileno(), msvcrt.LK_UNLCK, 1)
except:
pass
atexit.register(_unlock_file)
然后在初始化flask对象的时候调用
app = Flask()
__scheduler_init(app)
全文结束