我在项目中使用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的配置中添加网址。
答案 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)
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