2013-06-20 30 views
1

我的芹菜開始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() 

它運行得非常慢,比串行慢得多。問題是什麼?這是因爲芹菜組得到的結果很慢嗎?我該如何解決這個問題?

+0

如果需要更快的速度,只需添加更多的工人。工人也可以在其他機器上運行。這是使用AMQP的全部重點,如果你不允許在硬件問題上拋出問題,那麼芹菜可能是過量的。 –

+0

@PauloScardine非常感謝Paulo,從頂部看,concurrency:8(processes),我可以添加8個worker來做group()嗎?謝謝 – user2507194

+0

如果是CPU密集型的,那麼運行更多的工作者比運行核心沒有意義 - 如果您有其他機器需要備份,使用它們,在其他主機上使用AMQP服務器的真實IP地址而不是localhost(不要在每臺機器上運行一臺AMQP服務器,將所有機器指向同一臺服務器)。如果是I/O密集型,請在I/O等待低於1或2(vmstat 10 10'的最後一列)時繼續抽出。 –

回答

3

如果你timeit res.get()操作,你會注意到(我希望它是真的),總是大約500毫秒。這是因爲AsyncResult.get必須輪詢每個結果N毫秒。您可以通過獲取,間隔提供額外的參數調整如下:

res.get(interval=0.005) 

你可以得到更多的信息in documentationsource。需要警告的是,Celery並不是RPC類通信的最佳解決方案,因爲對結果進行輪詢會導致性能下降。

My own question

+0

請注意,在即將出現的Celery 3.1中有一個新的'rpc'後端爲此進行了優化:) – asksol

+0

也就是說,它是非持久性的,只有啓動任務的進程才能檢索結果(請求 - 回覆模式) – asksol

+0

@ asksol,謝謝。你能給一些鏈接/例子這個'rpc'後端如何工作?我沒有找到任何文件。 –