uWSGI上面跑APSchedler的定时任务不能执行?
uwsgi配置如上图
apscheduler代码如上图
我在uwsgi.ini文件中加入 enable-threads = true 后,在api中新加入的定时任务还是不执行
最后我在uwsgi.ini 文件中加入
# 解决APSchedler任务不能执行
enable-threads = true
preload=True
lazy-apps=true
此后在api中加入的新的定时任务,可以正常执行。
我添加了--enable-threads = true
后并没有用.
后来按照stackoverflow的这个回答Would starting APScheduler in a uwsgi app end up with one scheduler for each worker?找到了uWSGI的mule模块.
mule与普通worker进程一样, 但是request请求不会转发到mule进程, 可以通过这个进程运行定时任务.
最终我的uwsgi.ini为
[uwsgi]
socket = /usr/local/uwsgi/var/run/saltops.sock
chdir = /var/www/html/saltops
virtualenv = /opt/saltops_env
uid = nginx
gid = nginx
logto = /usr/local/uwsgi/var/log/saltops.log
wsgi-file = saltops/wsgi.py
enable-threads = true
mule = cronjob/__init__.py
cronjob/__init__.py
的内容为
# -*- coding: utf-8 -*-
from apscheduler.scheduler import Scheduler
from saltstack.cron_jobs import healthCheck
sched = Scheduler()
sched.add_interval_job(healthCheck, seconds = 30)
sched.start()
## 下面这句加在定时任务模块的末尾...判断是否运行在uwsgi模式下, 然后阻塞mule主线程(猜测).
try:
import uwsgi
while True:
sig = uwsgi.signal_wait()
print(sig)
except Exception as err:
pass
...mule可以独立实现定时器的功能, 也可以通过uwsgi
提供的模块实现cron
类型的任务, 但是这样就与uwsgi服务紧耦合了, 我很不喜欢, 所以还是选择APScheduler的实现.
uwsgi 里跑的是 web 会话,你不该把定时任务放在 web 会话里去运行,这会与用户请求相互影响。且由于 GIL 的关系,开多线程也用处不大,不如另起一个非 web 进程。即便你用 uwsgi 的 mule ,它也依然是另起一个不跑 web 会话的进程而已,何必增加复杂度。
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
1 回答2.9k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
我也碰到了这个问题,查资料得知:
uwsgi 默认one thread one processor ,所以在没有请求的时候,导致部分进程被挂起
解决方法: 在uwsgi配置中添加--enable-threads = true ,问题解决