2017-03-26 17 views
0

셀러리를 처음 사용하는 것은 사실입니다. 솔직히 말해서 나는 올바르게하고 있는지 잘 모르겠습니다. 내 시스템은 Windows에서 실행되어야하므로 RabbitMQ를 브로커로 사용하고 있습니다.Django Celery - RabbitMQ를 사용하여 객체를 뷰와 태스크 사이에 전달

개념 증명으로 하나의 작업이 값을 설정하고 다른 작업이 값을 읽으며 특정 작업을 수행 할 때 개체의 현재 값을 표시하려는 단일 개체를 만들려고합니다. url. 그러나 모든 문제 사이에 개체를 공유하는 데 문제가 있습니다.

내 celery.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)) 

내가 공유하기 위해 노력하고있어 개체는 다음과 같습니다

이것은 난 내 tasks.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 

입니다

class SchedulerQ(): 

    item = 0 

    def setItem(self, item): 
     self.item = item 

    def getItem(self): 
     return self.item 

내 apps.py에서 내 작업을 시작 ...이 작업에 적합한 장소인지 확실하지/근로자는 내가 sep에서 노동자를 시작할 때까지 작동하지 않는 것 같습니다 내가 콘솔 celery -A cesGroundStation -l info을 실행 arate 콘솔. Celery command output

:

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

응용 프로그램이 오류없이 실행하는 장고는 그러나 "셀러리 -A의 cesGroundStation -l 정보"에서 내 출력은 이것이다 : 내 views.py에서

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() 

나는이 있습니다

먼저 여러 개의 "SchedulerThread"작업을 시작한 것 같습니다. 둘째로 "SchedulerQ"개체는 업데이트 된 값을 읽지 않으므로 Rotators로 전달되지 않습니다.

그리고이 URL로 이동하면되는 I이 오류 얻을 views.schedulerQ보기 보여줍니다 Django views error

나는 매우, 파이썬, 장고와 일반적으로 웹 개발, 그래서 아주 작은 경험을 가지고있다가 그 마지막 오류로 어디서 시작해야할지 모르겠다. 해결책은 Redis를 사용하여 개체를보기에 전달하는 것이지만 RabbitMQ를 사용하여 개체를 전달하는 방법을 알지 못합니다. 나중에 schedulerQ 객체가 큐를 구현하고 스케쥴러와 로테이터가 큐의 내용을 보여주는 뷰와 함께 더 많은 프로듀서/소비자 동적 역할을 할 것이므로 데이터베이스를 사용하는 것은 리소스 집약적 일 수 있다고 생각합니다. 이 작업을 모든 작업에서 어떻게 공유 할 수 있습니까? 이것이 올바른 접근 방법일까요?

답변

0

적절한 접근 방법은 데이터베이스 또는 results back end과 같은 일부 지속성 계층을 사용하여 작업간에 정보를 공유해야하는 경우 작업간에 공유하려는 정보를 저장하는 것입니다 (이 예제에서 현재 넣고있는 작업 귀하의 클래스).

셀러리는 분산 메시지 전달 패러다임에서 작동합니다.이 예에서 아이디어를 추출하는 좋은 방법은 작업이 전달 될 때마다 모듈이 독립적으로 실행된다는 것입니다. 태스크가 Celery에 디스패치 될 때마다, 별도의 인터프리터에서 실행 중이며 다른 태스크와 독립적으로로드되었다고 가정해야합니다. 그 SchedulerQ 클래스는 매번 새로이 인스턴스화됩니다.

이전에 링크 된 문서와 best practice tips에 설명 된 방법으로 작업간에 정보를 공유하여 데이터 지속성 문제를 논의 할 수 있습니다.