Celery:为什么它的分布式任务比多处理运行得慢?

时间:2018-06-04 07:11:17

标签: python multiprocessing celery

我的电脑有16个cpu核心,并尝试比较时间,以完成celerymultiprocessing之间的任务

这是实验 (update_daily_price是从网络抓取某些股票每日价格数据的方法)

1)单线程进程

for s in symbol_list:
    update_daily_price(symbol)

花费了总共" 12分钟54secs"

2)muliprocessing图书馆

pool = Pool(8)
pool.map(update_daily_price, symbol_list)
pool.close()
pool.join()

花费了总共" 2分10秒"

3)celery' apply_async()

我按celery --workdir=trading/ --concurrency=8 -P eventlet worker

启动了工作流程

运行这样的任务:

@shared_task
def update_dailyprice_task1(symbol):
    update_daily_price(symbol)

from celery import group
jobs = group(update_dailyprice_task1.s(symbol) for symbol in symbol_list)
jobs.apply_async()

花费了总共" 10分钟24秒"

正如您在此处所看到的,1)3)之间差异不大。我在分发芹菜任务时遗漏了什么吗?

2 个答案:

答案 0 :(得分:0)

问题来自你的芹菜命令:

celery --workdir=trading/ --concurrency=8 -P eventlet worker

根据this page,你要求芹菜创造一个有8个绿色线程的工人。这与创建8个流程不同。这将有效地创建一个使用8个线程的进程。由于您的函数可能计算量很大,因此您最终会得到与一个流程执行相当的结果。

要使用多个进程,您需要使用prefork worker。使用以下命令可以获得与multiprocessing库类似的结果:

celery --workdir=trading/ --concurrency=8 worker

答案 1 :(得分:0)