2010-05-17 4 views
2

작은 Django 애플리케이션을 작성 중이므로 특정 간격으로 실행되는 각 모델 객체에 대해 을 각주기 객체에 대해 작성할 수 있어야합니다. 나는이 셀러리 응용 프로그램을 사용 해요,하지만 난 한 가지 이해할 수 없다 :Celery에서 PeriodicTask run() 메소드의 자체 매개 변수

다음
class ProcessQueryTask(PeriodicTask): 
    run_every = timedelta(minutes=1) 

    def run(self, query_task_pk, **kwargs): 
     logging.info('Process celery task for QueryTask %d' % 
query_task_pk) 
     task = QueryTask.objects.get(pk=query_task_pk) 
     task.exec_task() 
     return True 

내가 다음을 수행하고 있습니다를 :

>>> from tasks.tasks import ProcessQueryTask 
>>> result1 = ProcessQueryTask.delay(query_task_pk=1) 
>>> result2 = ProcessQueryTask.delay(query_task_pk=2) 

첫 번째 호출은 성공하지만, 다른 정기 간행물 호출을 반환 - TypeError : run()은 celeryd 서버에서 정확히 2 개의 키워드가 아닌 인수 (주어진 값 1)를 사용합니다. 자신의 매개 변수를 PeriodicTask run()에 전달할 수 있습니까?

답변

5

이것은 Ask Solem이 his response to your questioncelery-users Google group에 놀랍도록 대답했습니다.

주기적 작업은 인수를 사용하지 않으므로 여러 개의 클래스를 만들거나 둘 이상의 "모델"을 처리하는 주기적 작업을 만들어야합니다.

@task(ignore_result=True) 
def execute_query_task(task): 
    task.exec_task() 

@periodic_task(run_every=timedelta(minutes=1)) 
def process_query_tasks(): 
    for task in QueryTask.objects.all(): 
     ExecuteQueryTask.delay(task) 
:

예컨대 :

from celery.task import PeriodicTask 
from celery.decorators import periodic_task 

# base class 
class BaseProcessQueryTask(PeriodicTask): 
    abstract = True 
    run_every = timedelta(minutes=1) 
    query_task_pk = None 

    def run(self): 
     task = QueryTask.objects.get(pk=self.query_task_pk) 
     task.exec_task() 

class ProcessQueryTask1(BaseProcessQueryTask): 
    query_task_pk = 1 

class ProcessQueryTask2(BaseProcessQueryTask): 
    query_task_pk = 2 

은 그러나 당신이 뭔가를 할 가능성이있어

관련 문제