2012-02-12 66 views
13

我在決定使用python multiprocessing或芹菜或pp爲我的應用程序時有點麻煩。我的應用程序是非常重的CPU,但目前只使用一個CPU,所以我需要將它傳播到所有可用的CPU(這導致我看看Python的多處理庫),但我讀了這個庫不能縮放到其他機器如果需要。現在我不確定是否需要多個服務器來運行我的代碼,但我想在本地運行celery,然後擴展只需要添加新的服務器而不是重構代碼(如果我使用多)。Celery是否像Python多處理一樣在本地系統上高效?

我的問題:這個邏輯正確嗎?並且在本地使用芹菜時是否會有任何負面(性能)(如果事實證明一臺具有多個核心的服務器可以完成我的任務)?還是建議使用多處理,並在以後增加其他功能?

謝謝!

p.s.這是一個個人學習項目,但我可能有一天喜歡在一家公司工作,想要學習專業人員如何做。

+0

是什麼讓你認爲多個CPU可以幫助IO應用程序?如果您的應用程序是IO綁定的,那麼您需要多個IO通道,而不是CPU。 – 2012-02-12 16:46:52

+0

對不起錯誤的單詞......這是非常CPU密集型。基本上它只是一個大數據輸入的大型遞歸數學。看起來像一個好的過程分發 – Lostsoul 2012-02-12 17:01:30

+0

啊 - 在這種情況下,繼續:)你需要容錯 - 例如,試圖使用分散在各地的志願者計算 - 或者你只是想在實驗室或一個實驗室使用計算機簇? – 2012-02-12 17:47:54

回答

4

我實際上從來沒有使用芹菜,但我已經使用多處理。

芹菜似乎有幾種方法是傳遞消息(任務),包括方法,你應該能夠在不同的機器上運行的工人。因此,消極傳遞可能比多處理速度慢,但另一方面,您可以將負載傳播到其他機器。

你說得對,多處理只能在一臺機器上運行。但另一方面,進程之間的通信可以非常快速,例如通過使用共享內存。另外,如果您需要處理大量數據,則可以輕鬆地從本地磁盤讀寫數據,並在這些過程之間傳遞文件名。

我不知道Celery如何處理任務失敗。例如,任務可能永遠不會結束運行,或者可能會崩潰,或者如果任務沒有在某個時間限制內完成,您可能希望具有終止任務的能力。如果不存在,我不知道如何增加對此的支持。

多不來與容錯開箱即用,但你可以建立自己沒有太多的麻煩。

+2

由於消息傳遞的開銷,Celery確實比使用multiprocessing.Pool有更多的開銷。 Celery以任何形式處理任務失敗,它也支持時間限制以及更多。 Celery使用多處理池(celery.concurrency.processes.pool.Pool)的改進版本,該版本支持時間限制並修復與將Pool作爲服務運行(即永久運行)相關的許多錯誤以及與關閉相關的錯誤。有些人使用芹菜的游泳池版本。 – asksol 2012-02-12 09:38:49

+0

部分鏈接:http://docs.celeryproject.org/zh/latest/userguide/workers.html#time-limits http://docs.celeryproject.org/en/latest/userguide/workers.html#revoking-tasks池選項:http://docs.celeryproject.org/en/latest/internals/reference/celery.concurrency.processes.pool.html#celery.concurrency.processes.pool.Pool http://docs.celeryproject.org/ en/latest/internals/reference/celery.concurrency.processes.pool.html#celery.concurrency.processes.pool.Pool.apply_async – asksol 2012-02-12 09:44:00

+2

您也可以使用多重處理跨機器分發工作,但我不會推薦這樣做。製作高質量的產品可能需要付出相當大的努力,而且芹菜已經有一個解決這些問題的社區。 – asksol 2012-02-12 09:47:25

17

我完成了一個測試,以決定多少芹菜爲增加開銷超過multiprocessing.Pool和共享陣列。測試在(292,353,1652)uint16陣列上運行維納濾波器。兩個版本都使用相同的組塊(大致:將292,353尺寸除以可用CPU數量的平方根)。嘗試了兩種芹菜版本:一種解決方案發送醃製數據,另一種解決方案打開每個工人的底層數據文件。

結果:在我的16核i7 CPU芹菜約需16S,multiprocessing.Pool用約15秒共享陣列。我發現這種差異驚人的小。

增加粒度增加的差明顯(芹菜必須通過多個消息):芹菜需要15秒,multiprocessing.Pool需要12S。

要考慮到芹菜工人已經在主機上運行,​​而池工人在每次運行分叉。我不知道我怎麼會從頭開始多處理池,因爲我將共享陣列的初始化:

with closing(Pool(processes=mp.cpu_count(), initializer=poolinit_gen, initargs=(sourcearrays, resarrays))) as p: 

,只有resarrays被鎖定保護。

+1

我設法從測量中分離池設置,但幾乎沒有區別(如預期的那樣,叉子便宜)。 嘗試使用其他數據集(276,385,3821):芹菜通過酸洗轉移38s,多處理。池27s。 老實說,我發現芹菜更舒適的工作,它可以自然委託處理其他機器的情況下處理時間是真正長於轉移時間。在單臺機器上,只有大型數據集才能顯着提高性能。 – 2013-04-08 16:13:58

相關問題