我的电脑有16个cpu核心,并尝试比较时间,以完成celery
和multiprocessing
之间的任务
这是实验
(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)
之间差异不大。我在分发芹菜任务时遗漏了什么吗?
答案 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)