我的芹菜开始AMQP芹菜如何用Python运行这么慢的多任务?
-------------- [email protected] v3.0.19 (Chiastic Slide)
---- **** -----
--- * *** * -- Linux-3.8.0-25-generic-x86_64-with-Ubuntu-13.04-raring
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> broker: amqp://[email protected]:5672//
- ** ---------- .> app: proj.celery:0x25ed510
- ** ---------- .> concurrency: 8 (processes)
- *** --- * --- .> events: OFF (enable -E to monitor this worker)
-- ******* ----
--- ***** ----- [queues]
-------------- .> celery: exchange:celery(direct) binding:celery
还有一个功能:
def prime(n):
.....
.....
return number_of_primes_below_n
所以我做了这个功能,如芹菜任务,并与串行计算
串行:
[prime(i) for i in xrange(10, 100000)]
与芹菜平行:
from celery import *
g = group(prime.s(i) for i in xrange(10, 100000))
res = g.apply_async()
当我apply_async(),在后端的结果非常快速地示出像在终端屏幕上:
[2013年6月20日16:34:56238:INFO/MainProcess]任务PROJ。 tasks.do_work [989be06b-c4f3-4876-9311-2f5f813857d5]成功0.0166230201721s:99640324 [2013-06-20 16:34:56,241:INFO/MainProcess]任务proj.tasks.do_work [6eaa9b85-7ba2-4397- b6ae-cbb5668633d4]成功0.s:99740169 [2013-06-20 16:34:56,242:INFO/MainProcess]任务proj.tasks.do_work [1f5f6302-94a3-4937-9914-14690d856a5d]成功0.00850105285645s:99780121 [2013-06-20 16:34:56,244:INFO/MainProcess]任务proj.tasks.do_work [b3735842-a49c-48a3-8a9e-fab24c0a6c23]成功于0.0102620124817s:99820081 [2013-06-20 16:34:56,245:INFO/MainProcess]任务proj.tasks.do_work [98eec31a-52eb- 4752-92af-6956c0e6f130] 0.00973200798035s:99880036 [2013-06-20 16:34:56,245:INFO/MainProcess]任务proj.tasks.do_work [011a1e99-b307-480b-9765-b1a472dbfa8c]成功0.0115168094635s :99800100 [2013-06-20 16:34:56,245:INFO/MainProcess]任务proj.tasks.do_work [f3e3a89f-de79-4ab0-aab7-0a71fe2ab2f7]成功于0.010409116745s:99840064 [2013-06-20 16 :34:56246:信息/ MainProcess]任务proj.tasks.do_work [61baef04-03c2-4810-bf6a-ae7aa75b80b4]成功0.0112910270691s:99860049
但是当我希望得到的结果在芹菜
res.get()
它运行得非常慢,比串行慢得多。问题是什么?这是因为芹菜组得到的结果很慢吗?我该如何解决这个问题?
如果需要更快的速度,只需添加更多的工人。工人也可以在其他机器上运行。这是使用AMQP的全部重点,如果你不允许在硬件问题上抛出问题,那么芹菜可能是过量的。 –
@PauloScardine非常感谢Paulo,从顶部看,concurrency:8(processes),我可以添加8个worker来做group()吗?谢谢 – user2507194
如果是CPU密集型的,那么运行更多的工作者比运行核心没有意义 - 如果您有其他机器需要备份,使用它们,在其他主机上使用AMQP服务器的真实IP地址而不是localhost(不要在每台机器上运行一台AMQP服务器,将所有机器指向同一台服务器)。如果是I/O密集型,请在I/O等待低于1或2(vmstat 10 10'的最后一列)时继续抽出。 –