似乎Python標準庫缺少各種有用的併發相關概念,如原子計數器,執行程序和其他可以在例如java.util.concurrent中。是否有任何外部庫可爲併發Python應用程序提供更簡單的構建塊?Python更簡單的併發構建塊?
回答
正如前面提到的,Kamaelia旨在使併發更容易在python中使用。
它的原始使用案例是網絡系統(這是一個自然併發的),並以「我們如何使這些系統更容易開發和維護」的觀點開發。
從那時起,生活就已經開始,它被廣泛用於桌面系統(如白板應用,數據庫建模,教孩子閱讀和寫作的工具)到網站後端系統的各種問題領域(比如用於轉碼的東西)&轉換用戶提供的圖像和視頻以便在各種場景和短信/短信應用中進行網絡回放
核心概念與Unix管道基本相同 - 除了代替進程python生成器,線程或進程 - 被稱爲組件。這些通過收件箱和發件箱進行通信 - 儘可能多地滿足您的需求,而不僅僅是stdin/stdout/stderr。而不是要求序列化的文件接口,你在組件完全成熟的python對象之間傳遞。也可以不受流水線限制,可以擁有任意形狀 - 稱爲圖形線。
你可以找到一個完整的教程(視頻,幻燈片,下載的PDF小冊子)位置:
或者這裏5分鐘版本(O'Reilly的點燃談話):
儘管最近增加了一些語法糖,但圖書館的重點是務實開發,系統安全性和易維護性。像任何開發人員(我和其他人:-)歡迎關於改進它的反饋。
你也可以在這裏找到更多的信息: - http://www.slideshare.net/kamaelian
首先,Kamaelia的核心(軸突)被寫盡我的日常工作變得更容易,幷包裹起來的最佳實踐(消息傳遞軟件事務內存)中一個可重用的時尚。我希望它能讓你的生活更輕鬆:-)
Python(至少CPython)和Java的併發性是截然不同的,至少部分原因是全局解釋器鎖(GIL)。一般來說,Python中的併發不是通過線程來實現的,而是通過進程來實現的。有關「標準」併發模塊,請參見multiprocessing
。
另外,請查看"A Curious Course on Coroutines and Concurrency"瞭解一些對於來自Java的新手而言的併發技術。大衛比茲利(作者)是一個聰明的傢伙™當涉及到一般的Python,特別是併發性。
kamaelia提供工具用於提取併發線程或過程等
雖然它可能不會立即明顯,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)'
;-)。
這種原子性不僅僅是CPython的實現細節,還是GIL和C代碼一起工作的方式? – 2009-11-01 00:15:19
@ d = defaultdict(itertools.count)\ n for w in words_of_interest:next(d [w])' – jfs 2009-11-01 19:21:41
@JFSebastian,你的變體本質上不是「原子的」(在*之間的線程安全性有很大區別) *添加**一個字典的關鍵 - 包括隱式通過defaultdict - 這可能會導致重新散列,而不是嚴格使用現有的密鑰,這是我的代碼所做的)。 @Tuure,我剛剛瀏覽了IronPython和Jython的源代碼,似乎他們同意你的解釋 - 這聽起來很奇怪,但我想我可能在這裏錯了 - 讓我編輯來添加一個關於它的觀點! – 2009-11-01 22:59:26
P-workers在python多處理庫上創建一個「Job-Worker」抽象。它通過啓動具有特定技能/屬性(已定義函數)的「工人」並提供一個隊列來接收「作業」,從而簡化了多處理併發性。它有點類似於線程池,只有進程而不是線程。因此它更適合大量的CPU指令。您也可以使用它來產生單個應用程序的多個實例,甚至產生具有多個線程的「工人」。
- 1. 簡單python模塊中的錯誤
- 2. 如何使用我在python中創建的簡單模塊?
- 3. 創建併發送簡報
- 4. 創建一個簡單的Python菜單
- 5. Python - 簡單的數據幀重構
- 6. 創建一個簡單的python對象並將其發送回Mako.template.render()
- 7. 什麼是創建Python包結構和蛋的簡單說明?
- 8. 從多模塊pom構建單模塊
- 9. 構建並覆蓋一個簡單的Winelib DLL
- 10. 使用python模塊分發預構建的庫
- 11. 構建Python和更多關於丟失的模塊
- 12. 在Quartz.net中構建簡單的作業觸發器2.1.x
- 13. 更簡單的調試方法Maven使用eclipse構建
- 14. 簡單的隧道構建失敗 - NEAppProxyErrorDomain
- 15. 如何爲Android構建簡單的Mono?
- 16. 使用nix構建簡單的haskell庫
- 17. 構建一個簡單的均衡器
- 18. 構建簡單的推薦引擎
- 19. typo3 - 構建一個簡單的功能
- 20. 構建一個簡單的翻譯器
- 21. 構建一個簡單的CMS
- 22. PHP簡單的HTML DOM或Python-BSoup:哪一種更簡單?
- 23. 構建一個python模塊並將其鏈接到MacOSX框架
- 24. MySQL:簡單表上的併發更新(通過線程)
- 25. 簡單的Java併發問題
- 26. 簡單的重構
- 27. 無法對模塊進行更改(Python構建目錄)
- 28. 如何在Subversion的多模塊Maven構建中觸發Jenkins構建單個模塊?
- 29. 重構此Python代碼以簡化重複的簡單方法
- 30. 構建MySQL Python模塊時出錯
關於STM BTW - 關於如何使用簡化STM - http://www.kamaelia.org/STM的詳細信息,請參閱此頁。如果你熟悉版本控制,即使短語/名字可能,STM也不應該是怪異和可怕的。 – 2009-10-30 18:01:51