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

发布于 2022-09-06 02:51:33 字数 369 浏览 33 评论 0

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

clipboard.png

uwsgi配置如上图

clipboard.png

apscheduler代码如上图

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

垂暮老矣 2022-09-13 02:51:33

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

三寸金莲 2022-09-13 02:51:33

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

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

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

听你说爱我 2022-09-13 02:51:33

你好,上面的方法对于项目启动就需要执行的定时任务生效。可是用户通过api提交的定时任务任然不能正常执行,该怎么解决?

总以为 2022-09-13 02:51:33

我添加了--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的实现.

憧憬巴黎街头的黎明 2022-09-13 02:51:33

uwsgi 里跑的是 web 会话,你不该把定时任务放在 web 会话里去运行,这会与用户请求相互影响。且由于 GIL 的关系,开多线程也用处不大,不如另起一个非 web 进程。即便你用 uwsgi 的 mule ,它也依然是另起一个不跑 web 会话的进程而已,何必增加复杂度。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文