2010-12-29 2 views
2
#tasks.py 
from celery.task import Task 
class Randomer(Task): 
    def run(self, **kwargs): 
     #run Randomer again!!! 
     return random.randrange(0,1000000) 


>>> from tasks import Randomer 
>>> r = Randomer() 
>>> r.delay() 

지금은 간단한 작업을 실행합니다. 그리고 난수를 반환합니다. 하지만, 다른 작업을 실행하려면 어떻게해야합니까??셀러리에서 어떻게 작업을 실행 한 다음 해당 작업을 다른 작업으로 실행하고 계속 진행할 수 있습니까?

+0

왜이 작업을 수행 하시겠습니까? crontab이나 워치 독과 같은 것을 구현하려고합니까? 그렇다면이 질문은 [XY 문제] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)의 사례이며 원래 문제에 대해 묻는 것이 더 생산적 일 것입니다. 고안 한 솔루션을 구현하는 방법에 대해 묻는 대신 해결하려고합니다. –

답변

6

other_task.delay()으로 전화 할 수 있습니다. Randomer.run; 이 경우 Randomer.ignore_result = True (및 other_task.ignore_result 등)을 설정할 수 있습니다.

셀러리 작업 delay이 즉시 반환되므로 중첩 된 호출 (또는 재귀 호출)에 제한이나 대기 시간을 두지 않으면 매우 빨리 멜트 다운에 도달 할 수 있습니다.

재귀 또는 중첩 된 작업 대신 스택 오버플로를 방지하기 위해 무한 루프를 고려해야합니다.

from celery.task import Task 
class Randomer(Task): 
    def run(self, **kwargs): 
     while True: 
      do_something(**kwargs) 
      time.sleep(600) 
+0

예제 코드를 보여줄 수 있습니까? 나는 당신이 의미하는 것을 얻지 못합니다. – TIMEX

+0

하지만 do_something이 "Randomer()"가되고 싶습니다. 지연을 추가하여 끊임없이 이동하지 않고 휴식을 취할 수 있습니다. 랜도 머 클래스와 동일한 "do_something"이라는 또 다른 함수를 작성해야한다는 말입니까? – TIMEX

+0

'do_something'은 Randomers의 실제 작업이 무엇이든 의미합니다. 어떤 일이 계속 일어나길 원한다면, 큐가 아닌 루프가 필요합니다. 아마도 내가 틀렸어. 당신이 올린 샘플에서 이야기하기가 어렵다. 무한 재귀 호출을 작업 내에 두는 것은 위험합니다. 모든 컴퓨터 자원을 매우 빨리 소모 할 수 있습니다 (붕괴). –

2

당신은 체인 하위는 여기에 설명 된 수 : http://docs.celeryproject.org/en/latest/userguide/canvas.html#chains

+3

체인은 첫 번째 작업을 실행할 때 그 결과를 두 번째 작업에 공급할 때와 같이 연결해야합니다. 그러나 여기서의 질문은 다릅니다. 연쇄는 한 작업 결과를 다른 작업 결과로 보내는 것과 같습니다. 질문자의 의도는 중첩 된 작업 호출을 해결하는 것입니다. –

+0

나는 OP가 crontab이나 watchdog과 같은 것을 구현하기를 원한다고 생각한다. 그리고 작업 큐는 그것을위한 최고의 토대가 아니다. –

관련 문제