2009-10-30 52 views
2

似乎Python標準庫缺少各種有用的併發相關概念,如原子計數器,執行程序和其他可以在例如java.util.concurrent中。是否有任何外部庫可爲併發Python應用程序提供更簡單的構建塊?Python更簡單的併發構建塊?

回答

5

正如前面提到的,Kamaelia旨在使併發更容易在python中使用。

它的原始使用案例是網絡系統(這是一個自然併發的),並以「我們如何使這些系統更容易開發和維護」的觀點開發。

從那時起,生活就已經開始,它被廣泛用於桌面系統(如白板應用,數據庫建模,教孩子閱讀和寫作的工具)到網站後端系統的各種問題領域(比如用於轉碼的東西)&轉換用戶提供的圖像和視頻以便在各種場景和短信/短信應用中進行網絡回放

核心概念與Unix管道基本相同 - 除了代替進程python生成器,線程或進程 - 被稱爲組件。這些通過收件箱和發件箱進行通信 - 儘可能多地滿足您的需求,而不僅僅是stdin/stdout/stderr。而不是要求序列化的文件接口,你在組件完全成熟的python對象之間傳遞。也可以不受流水線限制,可以擁有任意形狀 - 稱爲圖形線。

你可以找到一個完整的教程(視頻,幻燈片,下載的PDF小冊子)位置:

或者這裏5分鐘版本(O'Reilly的點燃談話):

儘管最近增加了一些語法糖,但圖書館的重點是務實開發,系統安全性和易維護性。像任何開發人員(我和其他人:-)歡迎關於改進它的反饋。

你也可以在這裏找到更多的信息: - http://www.slideshare.net/kamaelian

首先,Kamaelia的核心(軸突)被寫盡我的日常工作變得更容易,幷包裹起來的最佳實踐(消息傳遞軟件事務內存)中一個可重用的時尚。我希望它能讓你的生活更輕鬆:-)

+0

關於STM BTW - 關於如何使用簡化STM - http://www.kamaelia.org/STM的詳細信息,請參閱此頁。如果你熟悉版本控制,即使短語/名字可能,STM也不應該是怪異和可怕的。 – 2009-10-30 18:01:51

3

Python(至少CPython)和Java的併發性是截然不同的,至少部分原因是全局解釋器鎖(GIL)。一般來說,Python中的併發不是通過線程來實現的,而是通過進程來實現的。有關「標準」併發模塊,請參見multiprocessing

另外,請查看"A Curious Course on Coroutines and Concurrency"瞭解一些對於來自Java的新手而言的併發技術。大衛比茲利(作者)是一個聰明的傢伙™當涉及到一般的Python,特別是併發性。

3

kamaelia提供工具用於提取併發線程或過程等

5

雖然它可能不會立即明顯,itertools.count確實原子計數器(在一個實例x操作,斯佩爾特next(x) ,如果C有這樣的概念,則相當於「原子++x」;-)。 編輯:至少,這肯定會持有CPython;我認爲它是Python標準定義的一部分,但顯然IronPython和Jython不同意(不確保它們在當前實現中的count.next的線程安全性),所以我可能錯了!

也就是說,假設你現在有一個數據結構,如:

counters = dict.fromkeys(words_of_interest, 0) 
    ... 
    if w in counters: counters[w] += 1 

,你的問題是,後者的增量不是原子,所以如果兩個線程同時處理同一個詞兩個增量可能會產生干擾(只有一個會「佔用」,所以計數器只會增加一個,而不是兩個)。然後:

counters = dict((w, itertools.count()) for w in words_of_interest) 
    ... 
    if w in counters: next(counters[w]) 

將執行相同的操作,但以原子方式。

(不幸的是沒有明顯的,記錄的方式來「提取計數器的當前值」,但其實str(x)不會返回從當前值可以再次解析出一個字符串,如'count(3)' ;-)。

+1

這種原子性不僅僅是CPython的實現細節,還是GIL和C代碼一起工作的方式? – 2009-11-01 00:15:19

+0

@ d = defaultdict(itertools.count)\ n for w in words_of_interest:next(d [w])' – jfs 2009-11-01 19:21:41

+1

@JFSebastian,你的變體本質上不是「原子的」(在*之間的線程安全性有很大區別) *添加**一個字典的關鍵 - 包括隱式通過defaultdict - 這可能會導致重新散列,而不是嚴格使用現有的密鑰,這是我的代碼所做的)。 @Tuure,我剛剛瀏覽了IronPython和Jython的源代碼,似乎他們同意你的解釋 - 這聽起來很奇怪,但我想我可能在這裏錯了 - 讓我編輯來添加一個關於它的觀點! – 2009-11-01 22:59:26

0

P-workers在python多處理庫上創建一個「Job-Worker」抽象。它通過啓動具有特定技能/屬性(已定義函數)的「工人」並提供一個隊列來接收「作業」,從而簡化了多處理併發性。它有點類似於線程池,只有進程而不是線程。因此它更適合大量的CPU指令。您也可以使用它來產生單個應用程序的多個實例,甚至產生具有多個線程的「工人」。