首页 > 解决方案 > 使用 Celery 的 Django 没有执行我的任务

问题描述

在过去的 3 天里,我一直在尝试让 django 定期执行异步任务。遇到了Celery,它似乎与我的问题完美匹配,但我在网上阅读的越多,我准备的问题似乎就越多。无论如何,我能够模糊地将信息整合在一起,最终提出一个“有点解决方案”,因为有太多不推荐使用的模块和方法,很难从头到尾找到一个工作示例。因此,我正在尝试创建一个任务,该任务将定期创建某个模型对象(为了论证,假设为 30 秒)。所以我安装了redis作为“经纪人”,(所以我认为适合其他讨论)并设法设置我的任务并运行,但问题是即使它执行,也没有创建新模型,我怀疑这可能是本地和设置时区之间的配置错误,但坦率地说我不确定,据说它应该能够在管理面板中通过 django-celery-beat 表运行时创建新实例

my __init__.py:

from __future__ import absolute_import, unicode_literals 

from .celery import app as celery_app 

__all__ = ('celery_app',)


celery.py in the base directory:

from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings


os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'firstApp.settings')
app = Celery('myProject')


app.config_from_object('django.conf:settings')
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))


my settings.py configuration:

BROKER_URL = 'redis://localhost:6379'
CELERY_TIMEZONE = 'EUROPE/London'

CELERY_BEAT_SCHEDULE = {
    'Every Minute' : {
        'task' : 'main.tasks.Check_State_Up',
        'schedule' : 30,
         
    }
}

注意,'main' 是我的应用程序的名称

my tasks.py in main app:

from celery import shared_task 

from django.shortcuts import get_object_or_404
import random 

from .models import CheckUp, Company



@shared_task
def Check_State_Up():
    parentInstance = get_object_or_404(ParentModel, symbol='Symbol')
    def create(parent):
        Widget.objects.create(parent=parent, randomValue=random.randint(100,250))

    create(parentInstance)

注意,父模型具有名称和符号值

并且小部件有一个父级(外键)和一个随机值

让我们记住,这个函数在 shell 中调用时工作得很好,我只是为了演示而发布了它

谁能帮我理解这里出了什么问题?

还有我的芹菜日志

celery -A myProject beat -l Info 
celery beat v5.0.5 (singularity) is starting.
__    -    ... __   -        _
LocalTime -> 2021-03-20 18:17:58
Configuration ->
    . broker -> redis://localhost:6379//
    . loader -> celery.loaders.app.AppLoader
    . scheduler -> celery.beat.PersistentScheduler
    . db -> celerybeat-schedule
    . logfile -> [stderr]@%INFO
    . maxinterval -> 5.00 minutes (300s)
[2021-03-20 18:17:58,033: INFO/MainProcess] beat: Starting...

它也停止并开始......

celery -A myProject worker -l 信息

 -------------- celery@myDevice v5.0.5 (singularity)
--- ***** -----
-- ******* ---- Windows-10-10.0.18362-SP0 2021-03-20 18:17:50
- *** --- * ---
- ** ---------- [config]
- ** ---------- .> app:         myProject:0x1502743f3d0
- ** ---------- .> transport:   redis://localhost:6379//
- ** ---------- .> results:     disabled://
- *** --- * --- .> concurrency: 4 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
 -------------- [queues]
                .> celery           exchange=celery(direct) key=celery


[tasks]
  . myProject.celery.debug_task
  . main.tasks.Check_State_Up

[2021-03-20 18:17:51,102: INFO/MainProcess] Connected to redis://localhost:6379//
[2021-03-20 18:17:51,130: INFO/MainProcess] mingle: searching for neighbors
[2021-03-20 18:17:51,904: INFO/SpawnPoolWorker-1] child process 1852 calling self.run()
[2021-03-20 18:17:51,922: INFO/SpawnPoolWorker-3] child process 8424 calling self.run()
[2021-03-20 18:17:51,955: INFO/SpawnPoolWorker-2] child process 8600 calling self.run()
[2021-03-20 18:17:52,002: INFO/SpawnPoolWorker-4] child process 14840 calling self.run()

笔记

调用 self.run() 的子进程 1000 仅在从管理面板手动启动时执行,而不是在启动时执行。我希望这足以理解。谢谢你。

还:

Django==3.1.7
django-celery-beat==2.2.0
celery==5.0.5
redis==3.5.3

标签: pythondjangoceleryscheduled-tasks

解决方案


推荐阅读