2013-03-25 160 views
19

我剛剛開始使用python gevent,我在想庫的cpu/mulitcore用法。Gevent多核使用

嘗試通過monkeypatched urllib做許多請求的一些示例我注意到,它們僅使用99%的負載在一個內核上運行。

如何使用python使用gevent的所有內核? 有最佳做法嗎?還是有任何使用多個進程和gevent的副作用?

BR 丹

回答

47

GEVENT給你處理阻止請求的能力。它不能讓您在多核上運行。

在任何時候只有一個運行在python進程中的greenlet(gevent的協同程序)。 gevent的真正好處在於,它在處理I/O瓶頸時非常強大(對於一般Web應用程序,提供API端點的Web應用程序,基於Web的聊天應用程序或後端以及一般情況下的網絡應用程序)。當我們做一些CPU大量的計算時,將會有使用gevent的性能增益no。當一個應用程序被I/O綁定時,gevent是純粹的魔法。

有一個簡單的規則:Greenlets得到切離每當一個I/O操作會阻塞或當你做開關明確地(例如用gevent.sleep())

內置的蟒蛇居然線程像gevent的greenlet一樣以「同時」的方式運行。

關鍵區別在於 - greenlets使用協作式多任務處理,其中線程使用搶先式多任務處理。這意味着一個greenlet永遠不會停止執行,並且「屈服」到另一個greenlet,除非它使用某些「產生」函數(如gevent.socket.socket.recv或gevent.sleep)。另一方面,線程將根據操作系統何時決定將其交換出去而產生給其他線程(有時是不可預知的)。

最後,利用Python中的多核心 - 如果這就是你想要的 - 我們必須依賴多處理模塊(這是Python中的一個內置模塊)。這個「繞過GIL」。其他選擇包括使用Jython或使用任務隊列並行執行任務(在不同的CPU上),例如, Zeromq。

我在這裏寫了一個很長的解釋 - http://learn-gevent-socketio.readthedocs.org/en/latest/。如果你在意潛水的細節。 :-D

+2

我可能會補充一點,根據情況,使用gevent運行幾個Python進程可能是一個好的解決方案。當然,如果流程需要大量交流,這不是一種選擇。 – ferrix 2013-03-25 14:51:05

+0

感謝您的回答。我想要的是在機器上執行儘可能多的I/O操作。問題是:我能夠使用n個進程(而不是線程)執行更多的請求,其中n = cpu_cores或者是gevent,其進程儘可能快嗎? – thesonix 2013-03-25 16:07:10

+1

下面是trunk.ly(用Alex Dong的話來說)如何處理I/O綁定和CPU綁定問題(他們抓取網站,然後將抓取的內容放入搜索索引中) - https://groups.google .com/d/msg/gevent/4hR1P6Vd-uk/4A4bw5ynuucJ – 2013-03-26 03:00:38