芹菜任务在Django应用程序中执行多次

2024-09-30 00:36:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Django应用程序,其中我在task.py下定义了几个@task函数,以便在给定的周期性任务中执行。我百分之百地确定这个问题不是由task.py或任何与代码相关的代码引起的,而是由settings.py或我的celery worker中的某些配置引起的。在

任务确实在周期性任务中执行,但会多次执行。在

以下是芹菜工人日志:

celery -A cimexmonitor worker --loglevel=info -B -c 4

[2019-09-19 21:22:16,360: INFO/ForkPoolWorker-5] Project Monitor Started : APPProject1
[2019-09-19 21:22:16,361: INFO/ForkPoolWorker-4] Project Monitor Started : APPProject1
[2019-09-19 21:25:22,108: INFO/ForkPoolWorker-4] Project Monitor DONE : APPProject1
[2019-09-19 21:25:45,255: INFO/ForkPoolWorker-5] Project Monitor DONE : APPProject1
[2019-09-20 00:22:16,395: INFO/ForkPoolWorker-4] Project Monitor Started : APPProject2
[2019-09-20 00:22:16,398: INFO/ForkPoolWorker-5] Project Monitor Started : APPProject2
[2019-09-20 01:22:11,554: INFO/ForkPoolWorker-5] Project Monitor DONE : APPProject2
[2019-09-20 01:22:12,047: INFO/ForkPoolWorker-4] Project Monitor DONE : APPProject2
  • 如果你检查以上的时间间隔,任务.py执行一个任务,但两个芹菜工人执行任务,并以相同的时间间隔执行同一个任务。我不知道为什么两个工人一个任务?

  • 在设置.py

^{pr2}$
  • 在芹菜.py在
from __future__ import absolute_import, unicode_literals
from celery import Celery 
import os
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE','cimexmonitor.settings')
## set the default Django settings module for the 'celery' program.

# Using a string here means the worker don't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.

app = Celery('cimexmonitor')
#app.config_from_object('django.conf:settings', namespace='CELERY') 
app.config_from_object('django.conf:settings')
# Load task modules from all registered Django app configs.
app.autodiscover_tasks(settings.INSTALLED_APPS)

@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))
  • 其他信息:
→ celery --version
4.3.0 (rhubarb)

→ redis-server --version
Redis server v=3.0.6 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=7785291a3d2152db

django-admin-interface==0.9.2
django-celery-beat==1.5.0
  • 请帮助我调试问题的方法:

谢谢


Tags: djangofrompyimportinfoprojectapptask
2条回答

worker和beat服务需要同时运行才能按照https://github.com/celery/django-celery-beat定期执行任务

  • 工人:
 $ celery -A [project-name] worker  loglevel=info -B -c 5
  • Django计划程序:
^{pr2}$
  • 我同时运行两个worker和database scheduler,根据文档,这导致问题同时执行,我真的不确定celery worker是如何同时作为DB调度器工作的。在
  • 运行celery worker就解决了我的问题。在

从官方文件:Ensuring a task is only executed one at a time。在

另外,我希望您不要以相同的方式运行多个worker(celery -A cimexmonitor worker loglevel=info -B -c 4),因为这意味着您有多个celery beats调度任务要运行。。。简言之-确保你只有一个芹菜节拍运行!在

相关问题 更多 >

    热门问题