我该如何配置芹菜任务

时间:2014-10-27 15:34:53

标签: python asynchronous celery distributed task-queue

我在项目中使用Celery,我将其用作调度程序(作为定期任务)。

我的Celery任务如下:

@periodic_task(run_every=timedelta(seconds=300))
def update_all_feed():
    feed_1()
    feed_2()
    ...........
    feed_n()

但随着饲料数量的增加,需要花费很长时间才能获得其他饲料(例如,当Celery使用饲料编号n时,需要很长时间才能进入下一个饲料(n + 1)。我想要使用Celery的并发性来启动多个提要。

在浏览完文档后,我发现我可以调用芹菜任务,如下所示:

feed.delay()

如何配置芹菜,以便获取所有饲料ID并聚合它们(例如,一次5个饲料)?我意识到要实现这一目标,我必须将Celery作为守护进程运行。

N.B:我使用mongodb作为经纪人,我所做的就是安装它并在Celery的配置中添加网址。

2 个答案:

答案 0 :(得分:0)

您可以像这样安排所有Feed

@periodic_task(run_every=timedelta(seconds=300))
def update_all_feed():
    feed_1.delay()
    feed_2.delay()
    .......
    feed_n.delay()

或者你可以使用一组来简化它

from celery import group
@periodic_task(run_every=timedelta(seconds=300))
def update_all_feed():
    group(feed.delay(i) for i in range(10))

现在要运行任务,您可以启动工作人员执行任务

celery worker -A your_app -l info --beat

这会每五分钟开始执行一次任务。但是,默认并发性等于cpu的核心。您也可以更改并发性。如果你想同时执行10个任务,那么

celery worker -A your_app -l info --beat -c 10

答案 1 :(得分:0)

来自Celery documentation

from celery.task.sets import TaskSet
from .tasks import feed, get_feed_ids

job = TaskSet(tasks=[
        feed.subtask((feed_id,)) for feed_id in get_feed_ids()
    ])

result = job.apply_async()
results = result.join() # There's more in the documentation