2012-04-04 26 views
4

我喜歡Python的全局解釋器鎖,因爲它使底層C代碼簡單。但它意味着每個Python解釋器主循環一次只能被限制在一個線程中。 這很糟糕,因爲最近每個處理器芯片的內核數量經常翻倍。是否有人使用zeromq在同一進程中協調多個Python解釋器?

一個假想的優勢zeromq是,它使多線程編程「易」或更容易。

是否有可能啓動多個Python解釋在同一進程,並讓他們使用過程中zeromq沒有其他共享的狀態只有溝通?有人試過嗎?它工作正常嗎?請評論和/或提供鏈接。

+0

爲什麼你想要線程,如果你不想共享狀態?這沒有任何意義。改用多個進程,例如'multiprocessing'或IPython的並行計算功能(使用zmq,btw)。 – 2012-04-04 18:46:02

+1

@Sven Marnach - 我想「爲什麼你想要線程,如果你不想共享狀態?這沒有任何意義」等同於說在每個Erlang中有多個Erlang'Process'是沒有意義的VM。線程通常比操作系統進程便宜,因此有一些好處。通過通信「共享」狀態是一種Erlang和Go lang方法,並且在共享OS進程邊界時可以非常有效。程序可能仍然是可以理解的,外部連接可能由具有良好吞吐量的相對簡單的「線程」池處理。 – gbulmer 2012-04-04 18:56:36

+0

@SvenMarnach:我猜測在同一個進程中使用內存消息傳遞的多線程會比使用多進程和進程間消息傳遞更快 - 我錯了嗎? – 2012-04-04 19:00:29

回答

4

我不知道在單個進程中創建多個Python解釋器實例的方式,但是我確實有在多個進程中分割多個實例並與zmq進行通信的經驗。

我一直在使用multiprocessing來實現全局優化的島模型體系結構,其中zmq用於管理島之間的通信。每個島嶼都有自己的過程,擁有自己的Python解釋器,由主羣島過程創建和管理。

使用multiprocessing讓你如你所願推出儘可能多的獨立Python解釋,但他們都居住在一個單獨的內存空間自己的流程。我相信OS調度程序負責將進程分配給內核並共享CPU時間。單獨的內存空間是最難的部分,因爲這意味着你必須明確地進行通信。爲了在進程之間進行通信,您希望發送的對象/數據必須是可序列化的,因爲zmq會發送字節字符串。

的好處約zmq是,它是一塊蛋糕規模跨越分佈在一個網絡系統,它是相當輕巧。您可以使用REP/REQ,PUB/SUB或其他任何方式創建您希望的任何通信模式。

但是,沒有,它不是那麼容易,因爲剛剛從threading模塊旋轉了幾個線程。

編輯:另外,這裏的類似你們一個堆棧溢出問題。裏面有一些更相關的鏈接,表明它可能在單個進程中運行多個Python解釋器,但看起來並不簡單。 Multiple independent embedded Python Interpreters on multiple operating system threads invoked from C/C++ program

+0

即使使用'multiprocessing',y ou可以在進程之間共享內存,例如使用[numpy-sharedmem](https://bitbucket.org/cleemesser/numpy-sharedmem/)。明確溝通並不是必須的。 – 2012-04-07 10:51:41

+0

@Sven Marnach - 在這個問題的評論中,你說多個Python解釋器可以在一個進程中啓動。這個答案說他們不知道如何。我錯過了什麼?你能否指點我(我們?)參照你所描述的做法? – gbulmer 2012-04-07 12:36:27

+0

@gbulmer:請參閱[官方文檔](http://docs.python.org/c-api/init.html#sub-interpreter-support)。此功能很少使用,因爲它使用多個進程幾乎總是更好 - 另請參見[Rakis的評論](http://stackoverflow.com/questions/2968317/multiple-independent-embedded-python-interpreters-on-多個操作系統t#comment3027567_2968317)在上面鏈接的線程。 – 2012-04-07 13:12:33

相關問題