我必须用我的django ORM数据做一些长时间(我认为2-3天)的任务。我环顾四周,没有找到任何好的解决方案。
django-tasks - http://code.google.com/p/django-tasks/没有详细记录,我也没有任何想法如何使用它。
芹菜 - http://ask.github.com/celery/对我的任务来说太过分了。 长期任务有用吗?
所以,我需要做的是,我只是从我的数据库中获取所有数据或部分数据,如:
Entry.objects.all()
然后我需要为每个QuerySet执行相同的功能。
我认为它应该工作2-3天左右。
所以,也许有人向我解释如何构建它。
P.S:目前我只有一个想法,使用cron和数据库来存储流程执行时间表。
答案 0 :(得分:1)
使用Celery子任务。这将允许您启动长时间运行的任务(在其下面有许多短期运行的子任务),并在Celery的任务结果存储中保存有关其执行状态的良好数据。作为一个额外的好处,子任务将分散在工作程序中,允许您充分利用多核服务器甚至多个服务器,以减少任务运行时间。
编辑:示例:
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中受益。