2011-09-10 11 views
2

私はdjangoのORMデータで長時間(私は思っていたように2〜3日)作業をしなければなりません。私は周りを見て、良い解決策を見つけませんでした。タスク管理デーモン

ジャンゴ・タスクは - http://code.google.com/p/django-tasks/は十分に文書化されていない、と私はどのようにそれを使用するために、任意のアイデアを持っていけません。

セロリ - http://ask.github.com/celery/は私の仕事にとっては過度です。 長期間の作業には適していますか?

だから、私は何をする必要があるか、私はちょうど同じように、私のデータベースからのデータのすべてのデータまたは一部を取得する:

Entry.objects.all() 

そして私は、クエリセットのそれぞれについて、同じ機能を実行する必要があります。

2〜3日ほどで動作するはずです。

だから、誰かがそれをどのように構築するか説明してくれるかもしれません。

P.S:私は唯一のアイデアを持っていますが、cronとデータベースを使用してプロセス実行タイムラインを保存します。

+1

セロリは長くても短い作業でもうまく機能します。明らかに、タスクを分割する方が良いです。失敗したパーツを再試行することができます。しかし、それは長いタスクで動作し、多くの人々がそれを使用します。 – asksol

+1

セロリは長年の仕事のために大変です。また、セロリも黙って仕事を失うことはありません。 – Thomas

答えて

1

セロリのサブタスクを使用します。これにより、長時間実行されるタスク(その下に短時間実行されるサブタスクが数多くあります)を開始し、Celeryのタスク結果ストア内の実行状態に関する良好なデータを保持することができます。追加のボーナスとして、タスクの実行時間を短縮するために、マルチコア・サーバーまたは複数のサーバーを最大限に活用できるように、サブタスクはワーカー・プロセス全体に分散されます。

EDIT:例:あなたの計算ごとのエントリのタスクにseggregatedすることができない場合は1つのサブタスクよう

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 

、あなたは常にそれを設定することができます集計を実行すると、1つのサブタスクが別の分析タイプを実行します。これはまだ動作しますが、それでもあなたは全身的なことから恩恵を受けることができます。

関連する問題