首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行重复作业的UWSGI定时器和cron装饰器

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

Stack Overflow用户
提问于 2014-01-21 06:19:44
回答 2查看 2.6K关注 0票数 3

一段时间以来,我一直在尝试让uwsgi python假脱机程序正常工作。我有一个运行django应用程序的设置,其中包含两个工作进程。我曾尝试将cron spooler (和一个计时器spooler)设置为每十分钟运行一次任务,但无论我尝试了什么设置,它似乎总是多次注册信号,并多次运行任务。

下面是我运行uwsgi的方式:

代码语言:javascript
复制
#!/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配置:

代码语言:javascript
复制
[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

(出于隐私原因,我更改了一些路径名)。被注释掉的行是不同的尝试,以使它不复制我的信号,但每次它似乎注册信号两次,有时甚至三次(假设在工作进程和单个假脱机进程中)。

代码语言:javascript
复制
[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文件:

代码语言:javascript
复制
@cron(-10, -1, -1, -1, -1)
def periodicUpdate(signal):
    print "Running cron job..."
    _getStats()

也尝试过

代码语言:javascript
复制
@timer(600)
def periodicUpdate(signal):
    print "Running cron job..."
    _getStats()

我还尝试将target='spooler'添加到计时器/cron-装饰器中,但似乎没有太多区别。

EN

回答 2

Stack Overflow用户

发布于 2014-01-21 11:21:20

你确定你没有在django.wsgi,settings.py或其他django相关文件中注册其他信号吗?--共享-导入只会加载一次(在主文件中)。

顺便说一句,我不明白你想要实现什么。这不是假脱机程序的工作方式,即使您想将其用作信号处理程序目标,也必须在注册信号时指定它(在装饰器中使用target=' spooler‘)

票数 3
EN

Stack Overflow用户

发布于 2022-01-12 16:04:04

虽然这是一个古老的问题,但我在其他地方找不到答案。我在Flask中使用了这个解决方案,但它应该与Django类似。

在初始化期间(prefork模式),您需要注册一个信号。

代码语言:javascript
复制
uwsgi.register_signal(26, "spooler", periodicUpdate)

然后计时器应该看起来像这样:

代码语言:javascript
复制
@timer(600, target='spooler')
def periodicUpdate(signal):
    print "Running cron job..."
    _getStats()

至于评论:

错误“只有master和worker可以注册信号处理程序”是正确的,因为您还没有注册任何信号。

的问题是

‘每当我在django应用程序中加载一个页面时,它都会重新注册它。

这很可能是因为它的工作线程只调用了一次方法(periodicUpdate)。这就是为什么在生成工作进程之前必须注册信号的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21245340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档