2012-01-17 3 views
8

5 분마다 실행해야하는 장시간 실행 프로세스가 있지만 프로세스의 둘 이상의 인스턴스가 동시에 실행되어서는 안됩니다. 프로세스는 일반적으로 5 분이 지나면 실행되지 않아야하지만 두 번째 인스턴스가 실행되는 경우 두 번째 인스턴스가 시작되지 않도록해야합니다.Django Celery : 장시간 실행되는 프로세스의 인스턴스 하나만 실행하십시오.

previous recommendation에 따르면 장거리 셀러 리를 사용하여 장기 실행 작업을 예약하고 있습니다.

정기적 인 작업이 작동하지 않는다고 생각합니다. 5 분이 지났을 때 다른 작업 인스턴스가 이미 실행중인 경우 두 번째 작업을 실행하지 않으려 고합니다.

현재 실험은 다음과 같습니다. 8시 55 분에 작업 인스턴스가 실행되기 시작합니다. 작업이 끝나면 다음 5 분 표시에서 다른 인스턴스가 실행됩니다. 따라서 첫 번째 작업이 8:57에 끝나면 두 번째 작업은 9:00에 실행됩니다. 첫 번째 작업이 오래 실행되고 9:01에 끝나면 다음 인스턴스가 9:05에 실행되도록 예약합니다.

저는 아래의 간단한 예제보다 더 많은 것을 수행 할 때 다양한 암호를 사용하는 데 어려움을 겪었으므로 이전 인스턴스에서 작업을 예약하는 사람들의 다른 예는 찾지 못했습니다. 내가하려고하는 일을하는 데 더 나은 접근법이 있는지 궁금합니다. 나는 일의 이름을 짓는 방법이 있다는 것을 알고있다. 같은 이름의 실행중인 인스턴스 또는 예약 된 인스턴스를 검색하는 방법이 있습니까? 누구나 5 분마다 작업을 실행하는 것과 관련하여 조언을 제공하지만 한 번에 하나의 작업 만 실행하도록 보장합니까?

는 인 MyModule/tasks.py에서 조

감사하십시오 ./manage.py 쉘에서

import datetime 
from celery.decorators import task 

@task 
def test(run_periodically, frequency): 

    run_long_process() 
    now = datetime.datetime.now() 
    # Run this task every x minutes, where x is an integer specified by frequency 
    eta = (
     now - datetime.timedelta(
     minutes = now.minute % frequency , seconds = now.second, 
     microseconds = now.microsecond)) + datetime.timedelta(minutes=frequency) 
    task = test.apply_async(args=[run_periodically, frequency,], eta=eta) 

:

from mymodule import tasks 
result = tasks.test.apply_async(args=[True, 5]) 

답변

7

당신은 사용할 수 있습니다 정기적 인 작업은 한 번에 하나씩 작업이 실행되도록하는 특수 잠금과 쌍을 이룹니다. 그들 중 하나에 오류가있을 것입니다 경우 작업의 실행을 중지 할 수 있습니다 이전 실행에서 예약 작업에

http://ask.github.com/celery/cookbook/tasks.html#ensuring-a-task-is-only-executed-one-at-a-time

귀하의 한 방법 : 다음 셀러리 문서의 샘플 구현입니다.

+0

감사합니다. 0x00mh. 그것은 깔끔한 링크입니다. 나는 그것을 시험해보고있다. –

관련 문제