2011-09-10 7 views
2

장고 ORM 데이터로 오랜 시간 (2-3 일 정도) 작업을해야합니다. 나는 주변을 둘러보고 좋은 해결책을 찾지 못했다.작업 관리 데몬

django-tasks -는 잘 설명되어 있지 않으며 사용 방법이 없습니다.

셀러리 - http://ask.github.com/celery/은 내 작업에 과도합니다. 오랜 시간 작업에 좋습니까?

그래서, 내가해야 할 일, 내가처럼, 내 데이터베이스에서 데이터의 모든 데이터 또는 일부를 얻을 :

Entry.objects.all() 

그리고 내가 검색어 세트의 각각에 대해 동일한 기능을 실행해야합니다.

약 2 ~ 3 일이 걸릴 것으로 생각합니다.

누군가가 나를 어떻게 설명하는지 설명해 줄 수 있습니다.

P.S : 현재로서는 아이디어가 하나 뿐이므로 cron과 데이터베이스를 사용하여 프로세스 실행 타임 라인을 저장하십시오.

+1

셀러리는 길거나 짧은 작업을 위해 잘 작동합니다. 분명히 작업을 분할하는 것이 낫습니다. 그러면 실패한 부분을 다시 시도 할 수 있습니다. 그러나 그것은 긴 작업으로 작동하며, 많은 사람들은 그것을 위해 그것을 사용합니다. – asksol

+1

셀러리는 장기간의 작업에 좋습니다. 또한 셀러리는 자동으로 작업을 잃지 않습니다. – Thomas

답변

1

셀러리 하위 작업을 사용하십시오. 이렇게하면 장기 실행 태스크 (그 아래에 많은 단기 실행 하위 태스크가 있음)를 시작할 수 있고 Celery 태스크 결과 스토어에서 실행 상태에 대한 좋은 데이터를 유지할 수있다. 추가 작업 보너스로 작업 시간을 줄이기 위해 멀티 태스킹 서버 또는 다중 서버를 최대한 활용할 수 있도록 작업 프로세스간에 하위 작업이 분산됩니다.

편집 : 예 : 귀하의 계산이 당 항목 작업에 seggregated 할 수없는 경우

import time, logging as log 
from celery.task import task 
from celery.task.sets import TaskSet 
from app import Entry 

@task(send_error_emails=True) 
def long_running_analysis(): 
    entries = list(Entry.objects.all().values('id')) 
    num_entries = len(entries) 
    taskset = TaskSet(analyse_entry.subtask(entry.id) for entry in entries) 
    results = taskset.apply_async() 
    while not results.ready() 
     time.sleep(10000) 
     print log.info("long_running_analysis is %d% complete", 
         completed_count()*100/num_entries) 
    if results.failed(): 
     log.error("Analysis Failed!") 
    result_set = results.join() # brings back results in 
           # the order of entries 
    #perform collating or count or percentage calculations here 
    log.error("Analysis Complete!") 

@task 
def analyse_entry(id): # inputs must be serialisable 
    logger = analyse_entry.get_logger() 
    entry = Entry.objects.get(id=id) 
    try: 
     analysis = entry.analyse() 
     logger.info("'%s' found to be %s.", entry, analysis['status']) 
     return analysis # must be a dict or serialisable. 
    except Exception as e: 
     logger.error("Could not process '%s': %s", entry, e) 
     return None 

, 당신은 항상을 설정할 수 있도록 하나 개의 하위 집계를 수행하면 하나의 하위 타스크는 다른 분석 유형을 수행합니다. 그리고 이것은 여전히 ​​작동 할 것이고, 당신이 parelelleism에서 benifit하는 것을 여전히 허락 할 것입니다.