2014-01-20 127 views
1

我一直在試圖使uwsgi python假脫機程序在一段時間內正常工作。我有一個安裝程序,在其中運行帶有兩個工作進程的django應用程序。我曾嘗試設置一個cron假脫機程序(和一個定時器假脫機程序)來每十分鐘運行一次任務,但不管我嘗試過的設置的配置如何,似乎總是多次註冊信號,並且多次運行任務。運行重複作業的UWSGI計時器和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 

這是我uwsgi諸侯配置在/etc/uwsgi/vassals/django.ini:

[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的,裝飾,但它似乎沒有很多有什麼區別。

回答

2

您確定沒有在django.wsgi,settings.py或其他與django相關的文件中註冊其他信號嗎? - 共享導入只會加載一次(在主內)。

順便說一句我沒有得到你想要完成的。這不是假想假想的工作方式,即使你想用它作爲信號處理器的目標,你必須在註冊信號時指定它(在裝飾器中有target ='spooler')

+0

我所有試圖完成的是每十分鐘運行一次腳本。它每十分鐘運行一次,但它似乎要運行兩到三次,而不是我所期望的一次。我不明白我是如何以任何方式濫用假脫機程序的。它似乎與文檔用例相匹配。即使我將target ='spooler'放在裝飾器中,它會多次運行(例如,它會打印「Running cron job ...」並用重複數據填充我的數據庫) – eirikrye

+0

如果我添加target ='spooler',並使用假脫機程序導入來將包含cronjob的文件導入假脫機程序,我得到一個錯誤,說「只有主人和工人可以註冊信號處理程序」,並且沒有信號被註冊或執行。如果我刪除目標並使用共享導入或導入,則cron/timer信號最初會被註冊一次,但每當我在我的django應用程序中加載其中一個頁面(例如,我「喚醒」其中一個工作進程)時,重新註冊它。 – eirikrye

+0

假脫機程序通過異步運行排隊任務而不影響工作人員工作。所以,它的「經典」用法是讓你的信號處理程序在假脫機程序中排隊請求。你的問題是你有些重新註冊信號。我建議你從一開始就用一個簡單的應用程序(一個在同一個文件中有一個@cron條目的hello world WSGI)重新開始,一旦所有的工作都按預期工作,試着用你的django應用程序來解決這個問題。 – roberto