赞
踩
在 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)
全文结束
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。