uWSGI类cron接口,基于信号的定时器

时间:2014-01-16 18:09:36

标签: python uwsgi

我正在尝试让一个类似cron的进程每60秒运行一次。我不希望它被每个线程执行。有没有办法指定哪个uwsgi工作人员会响应信号?

我目前已将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

1 个答案:

答案 0 :(得分:5)

使用Python装饰器:timer,可能还有spool。根据文档,基于信号的装饰器在第一个可用的工作者中执行信号处理程序。但是,在惰性模式下,应用程序将在每个工作程序中单独加载和执行,并且uWSGI不够智能,只能创建一次计时器。最简单的解决方法是使用shared-import配置选项并在那里启动计时器。