我一直在尝试让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'
添加到timer / cron-decorator中,但似乎没有太多区别。
答案 0 :(得分:2)
您确定在django.wsgi,settings.py或其他django相关文件中没有注册其他信号吗? --shared-import只会加载一次(在master中)。
顺便说一下,我没有得到你想要完成的任务。这不是假脱机程序应该如何工作,即使你想将它用作信号处理程序目标,你必须在注册信号时指定它(在装饰器中使用target ='spooler')