uWSGI+APScheduler不能执行定时任务?

uWSGI上面跑APSchedler的定时任务不能执行?

clipboard.png

uwsgi配置如上图

clipboard.png

apscheduler代码如上图

阅读 13k
5 个回答

我也碰到了这个问题,查资料得知:
uwsgi 默认one thread one processor ,所以在没有请求的时候,导致部分进程被挂起
解决方法: 在uwsgi配置中添加--enable-threads = true ,问题解决

我在uwsgi.ini文件中加入 enable-threads = true 后,在api中新加入的定时任务还是不执行
最后我在uwsgi.ini 文件中加入

# 解决APSchedler任务不能执行
enable-threads = true
preload=True
lazy-apps=true

此后在api中加入的新的定时任务,可以正常执行。

新手上路,请多包涵

你好,上面的方法对于项目启动就需要执行的定时任务生效。可是用户通过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 会话的进程而已,何必增加复杂度。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题