我一直在試圖使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的,裝飾,但它似乎沒有很多有什麼區別。
我所有試圖完成的是每十分鐘運行一次腳本。它每十分鐘運行一次,但它似乎要運行兩到三次,而不是我所期望的一次。我不明白我是如何以任何方式濫用假脫機程序的。它似乎與文檔用例相匹配。即使我將target ='spooler'放在裝飾器中,它會多次運行(例如,它會打印「Running cron job ...」並用重複數據填充我的數據庫) – eirikrye
如果我添加target ='spooler',並使用假脫機程序導入來將包含cronjob的文件導入假脫機程序,我得到一個錯誤,說「只有主人和工人可以註冊信號處理程序」,並且沒有信號被註冊或執行。如果我刪除目標並使用共享導入或導入,則cron/timer信號最初會被註冊一次,但每當我在我的django應用程序中加載其中一個頁面(例如,我「喚醒」其中一個工作進程)時,重新註冊它。 – eirikrye
假脫機程序通過異步運行排隊任務而不影響工作人員工作。所以,它的「經典」用法是讓你的信號處理程序在假脫機程序中排隊請求。你的問題是你有些重新註冊信號。我建議你從一開始就用一個簡單的應用程序(一個在同一個文件中有一個@cron條目的hello world WSGI)重新開始,一旦所有的工作都按預期工作,試着用你的django應用程序來解決這個問題。 – roberto