芹菜:一次调度大量工作

时间:2016-02-01 07:40:46

标签: python celery

目前,我有大约5000个工作,我已经调度和即时调度:

df['ID'] = df[['IDx', 'IDy']].apply(lambda x: ','.join(x.fillna('')), axis=1)
df['ID'] = df['ID'].str.strip(',')

完成循环需要大约18秒

我已尝试将它们全部作为群组()通话发送,但它似乎也很慢。

关于如何快速派遣多个工作的任何建议?

另外,我已尝试通过多处理并行化调度,但线程/进程的开销似乎也否定了这个好处

2 个答案:

答案 0 :(得分:2)

这将取决于如何检索Jobs,但我们使用调度程序任务处理此问题,然后我们可以调用调度程序任务。

@task
def process_job(job):
    # do stuff for this job

@task
def dispatcher():
    for job in Jobs:
        process_job.apply_async(args=[job], queue='job_queue')

答案 1 :(得分:0)

也许您应该尝试celery-dispatcher,它使用一个独立的线程来分派任务。

您可以在主任务中产生子任务,并在另一个函数中处理每个结果:

def handle_result(root_id, task_id, retval, **kwargs):
    print(retval)

@shared_task
def sqrt(i):
    return i * i

@dispatch(receiver=handle_result)
@shared_task
def calc():
    for i in range(10):
        yield sqrt, (i,)