flask_apscheduler一款定时任务器
-
下载:
pip install Flask-APScheduler
-
通过定义工厂函数注册app
# SCHEDULER_OPEN为配置是否开启定时 if app.config.get("SCHEDULER_OPEN"): scheduler_init(app)
-
为了保证系统只启动一次定时任务:文件锁
def scheduler_init(app): """ 保证系统只启动一次定时任务 :param app: :return: """ if platform.system() != 'Windows': fcntl = __import__("fcntl") f = open('scheduler.lock', 'wb') try: fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB) scheduler.init_app(app) scheduler.start() app.logger.debug('Scheduler Started,---------------') except: pass def unlock(): fcntl.flock(f, fcntl.LOCK_UN) f.close() atexit.register(unlock) else: msvcrt = __import__('msvcrt') f = open('scheduler.lock', 'wb') # 上线更改........ try: msvcrt.locking(f.fileno(), msvcrt.LK_NBLCK, 1) scheduler.init_app(app) scheduler.start() app.logger.debug('Scheduler Started,----------------') except Exception as e: print(e) print("发生错误2") pass def _unlock_file(): try: f.seek(0) msvcrt.locking(f.fileno(), msvcrt.LK_UNLCK, 1) except: pass atexit.register(_unlock_file)
需要注意是,windows在debug=True时启动会报错。有Permission denied问题。debug=False 不会报错。 一般我都是注释掉:msvcrt.locking(f.fileno(), msvcrt.LK_NBLCK, 1)即可。
-
JOBS相关配置:
JOBS = [ { 'id': 'calculate_to_db_uv',# 任务id 'func': 'hrv_server.task.time_task.pv_uv:calculate_to_db_uv',# 执行任务对应函数 'args': (1, 2),#传入参数 'trigger': 'interval', #任务类型定时操作 # 'hour': 0, # 'minute': 0, 'seconds': 20# 每20秒执行一次 }, { 'id': 'calculate_to_db_uv', 'func': 'hrv_server.task.time_task.pv_uv:calculate_to_db_uv', 'args': (1, 2), 'trigger': 'cron',#触发器执行 # 每天 23点40分执行 'day_of_week': "0-6", 'hour': 23, 'minute': 40, }, ]
-
部署gunicorn
# 并行工作进程数 workers = 4 # 指定每个工作者的线程数 threads = 4 # 监听内网端口80 bind = '0.0.0.0:80' # 工作模式协程 worker_class = 'eventlet' # 设置最大并发量 worker_connections = 2000 # 设置进程文件目录 pidfile = 'gunicorn.pid' # 设置访问日志和错误信息日志路径 accesslog = './logs/gunicorn_acess.log' errorlog = './logs/gunicorn_error.log' # 设置日志记录水平 loglevel = 'info' # 代码发生变化是否自动重启 reload=True