我一直在尝试让 uwsgi python 假脱机程序正常工作很长一段时间。我有一个设置,其中我运行一个带有两个工作进程的 django 应用程序。我已经尝试设置一个 cron 后台处理程序(和一个计时器后台处理程序)每十分钟运行一次任务,但无论我尝试过什么样的设置配置,它似乎总是多次注册信号,并多次运行任务。
这就是我运行 uwsgi 的方式:
#!/bin/bash
sudo uwsgi --emperor /etc/uwsgi/vassals --uid http --gid http --enable-threads --pidfile=/tmp/uwsgi.pid --daemonize=/var/log/uwsgi/uwsgi.log
这是我在/etc/uwsgi/vassals/django.ini 中的 uwsgi vassal 配置:
[uwsgi]
chdir = /home/user/django
module = django.wsgi
master = true
processes = 2
socket = /tmp/uwsgi-django.sock
vacuum = true
pidfile = /tmp/uwsgi-django.pid
daemonize = /home/user/django/log.log
env = DJANGO_SETTINGS_MODULE=django.settings
#lazy-apps = false
#lazy = false
spooler = %(chdir)/tasks
#spooler-processes = 1
#import = django-app/spooler.py
#spooler-import = django-app/spooler.py
shared-import = django-app/spooler.py
(出于隐私原因,我更改了一些路径名称)。被注释掉的行是为了让它不重复我的信号而进行的各种尝试,但每次它似乎都记录了两次信号,有时甚至三次(大概是在工作进程和单个假脱机程序进程中)。
[uwsgi-signal] signum 0 registered (wid: 0 modifier1: 0 target: default, any worker)
[uwsgi-signal] signum 1 registered (wid: 1 modifier1: 0 target: default, any worker)
[uwsgi-signal] signum 1 registered (wid: 2 modifier1: 0 target: default, any worker)
有谁知道为什么会发生这种情况,以及如何正确预防这种情况?
这是 spooler.py 文件:
@cron(-10, -1, -1, -1, -1)
def periodicUpdate(signal):
print "Running cron job..."
_getStats()
也试过
@timer(600)
def periodicUpdate(signal):
print "Running cron job..."
_getStats()
我还尝试将 target='spooler'
添加到计时器/cron-decorator,但似乎没有太大区别。
最佳答案
你确定你没有在 django.wsgi、settings.py 或其他 django 相关文件中注册其他信号吗? --shared-import 只会加载一次(在 master 中)。
顺便说一句,我不明白你想要完成什么。这不是假脱机程序应该如何工作的,即使你想将它用作信号处理程序目标,你也必须在注册信号时指定它(在装饰器中使用 target='spooler')
关于python - UWSGI 计时器和 cron 装饰器运行重复作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21245340/