2014-01-16 79 views
2

我想要一個類似cron的進程,每60秒運行一次。我不希望它被每個線程執行。有沒有辦法指定哪個uwsgi工作人員會對信號做出反應?uWSGI類似cron的接口,基於信號的定時器

我目前有uwsgi配置有一個主進程,懶惰模式和2個工作者與2個線程。

我直接在我的wsgi文件中有以下代碼。

def sig_test(signum): 
    print "do this thing" + signum 

uwsgi.register_signal(99, "", sig_test) 
uwsgi.add_timer(99, 60) 

信號登記段獲取兩個線程運行,並導致以下錯誤:

Traceback (most recent call last): 
File "/var/local/wsgi.wsgi", line 153, in <module> 
uwsgi.register_signal(99, "worker 1", sig_test) 
ValueError: unable to register signal 
Wed Jan 15 16:01:57 2014 - unable to load app 0 (mountpoint='') (callable not found or import error) 
Wed Jan 15 16:01:57 2014 - *** no app loaded. going in full dynamic mode *** 
Wed Jan 15 16:02:08 2014 - [uwsgi-signal] you have registered this signal in worker 2 memory area, only that process will be able to run it 
Wed Jan 15 16:02:08 2014 - error managing signal 99 on worker 1 

回答

4

使用Python裝飾:timer和可能spool。根據文檔,基於信號的修飾器在第一個可用工作人員中執行信號處理程序。但是,在懶惰模式下,應用程序會分別在每個工作人員中加載並執行,而uWSGI不夠聰明,只能創建一次計時器。最簡單的修復方法是使用shared-import配置選項並在那裏初始化計時器。

+1

uwsgi被配置爲使用'懶惰模式'。根據文檔,懶惰模式_將指示uWSGI在每個worker_之後加載應用程序。這導致在兩個不同信號上設置多個定時器。 如果我禁用懶惰模式,然後裝飾(和我上面的代碼)工作正常。 – kevlarkevin

+0

@kevlarkevin編輯了我的答案 – jwalker