UWSGI计时器和cron装饰器运行重复的作业

时间:2014-01-20 22:19:44

标签: python timer cron uwsgi spooler

我一直在尝试让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中,但似乎没有太多区别。

1 个答案:

答案 0 :(得分:2)

您确定在django.wsgi,settings.py或其他django相关文件中没有注册其他信号吗? --shared-import只会加载一次(在master中)。

顺便说一下,我没有得到你想要完成的任务。这不是假脱机程序应该如何工作,即使你想将它用作信号处理程序目标,你必须在注册信号时指定它(在装饰器中使用target ='spooler')