Django Celery使用RabbitMQ在视图和任务之间传递对象

2024-10-02 10:29:30 发布

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

这是我第一次用芹菜,老实说,我不确定我是不是做对了。我的系统必须运行在Windows上,所以我使用RabbitMQ作为代理。在

作为概念证明,我尝试创建一个单一的对象,其中一个任务设置值,另一个任务读取该值,我还希望在转到某个url时显示该对象的当前值。但是我在所有东西之间共享对象时遇到了问题。在

这是我的芹菜.py在

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

os.environ.setdefault('DJANGO_SETTINGS_MODULE','cesGroundStation.settings')

app = Celery('cesGroundStation')

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

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

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

我想分享的对象是:

^{pr2}$

这是我的任务.py在

from celery import shared_task
from time import sleep
from scheduler.schedulerQueue import SchedulerQ

schedulerQ = SchedulerQ()

@shared_task()
def SchedulerThread():
    print ("Starting Scheduler") 
    counter = 0
    while(1):
        counter += 1
        if(counter > 100):
            counter = 0
        schedulerQ.setItem(counter)
        print("In Scheduler thread - " + str(counter))
        sleep(2)
    print("Exiting Scheduler")

@shared_task()
def RotatorsThread():
    print ("Starting Rotators") 
    while(1):
        item = schedulerQ.getItem()
        print("In Rotators thread - " + str(item))
        sleep(2)
    print("Exiting Rotators")

@shared_task()
def setSchedulerQ(schedulerQueue):
    schedulerQ = schedulerQueue

@shared_task()
def getSchedulerQ():
    return schedulerQ

我要在我的应用程序.py…我不确定这是否是正确的位置,因为在我运行celery -A cesGroundStation -l info的独立控制台中启动worker之前,任务/工作线程似乎不起作用。在

from django.apps import AppConfig
from scheduler.schedulerQueue import SchedulerQ
from scheduler.tasks import SchedulerThread, RotatorsThread, setSchedulerQ, getSchedulerQ

class SchedulerConfig(AppConfig):
    name = 'scheduler'

    def ready(self):
        schedulerQ = SchedulerQ()
        setSchedulerQ.delay(schedulerQ)
        SchedulerThread.delay()
        RotatorsThread.delay()

在我的视图.py我有这个:

def schedulerQ():
    queue = getSchedulerQ.delay()
    return HttpResponse("Your list: " + queue)

django应用程序运行时没有错误,但是我从“celery-A cesGroundStation-l info”输出的是:Celery command output

首先它似乎启动了多个“SchedulerThread”任务,其次“SchedulerQ”对象没有被传递给Rotators,因为它没有读取更新的值。在

如果我转到显示views.schedulerQ我看到这个错误: Django views error

我对Python、Django和Web开发基本上没有什么经验,所以我不知道从哪里开始处理最后一个错误。解决方案建议使用Redis将对象传递给视图,但我不知道如何使用RabbitMQ来实现这一点。稍后,schedulerQ对象将实现一个队列,调度程序和旋转器将更像一个生产者/消费者动态视图,显示队列的内容,因此我认为使用数据库可能会过于耗费资源。如何在所有任务中共享此对象?这是否是正确的方法?在


Tags: 对象djangofrompyimporttasksettingsdef
1条回答
网友
1楼 · 发布于 2024-10-02 10:29:30

正确的方法是使用某种持久性层,例如数据库或results back end来存储您希望在任务之间共享的信息,如果您需要在任务之间共享信息(在本例中,您当前正在类中放入的内容)。在

Celery使用的是分布式消息传递范式—在本例中,提取这种思想的一个好方法是,每次任务被调度时,模块都将独立执行。每当一个任务被调度到Celery时,您必须假设它在独立的解释器中运行,并且独立于其他任务进行加载。{cd1>每次实例化一个类。在

您可以按照前面链接的文档中描述的方式在任务之间共享信息,并且一些best practice tips讨论数据持久性问题。在

相关问题 更多 >

    热门问题