2010-11-19 84 views
5

在Jython中可能會遇到多線程/並行性瓶頸的常見隱藏事件是什麼?我有一些並行的代碼(使用Python的線程庫),將不能擴展過去的3-4個CPU,我敢肯定,這是因爲這些明顯的缺陷不是:Jython中隱藏的多線程瓶頸?

  • 明確鎖

  • 調用庫代碼需要同步(我試圖並行基本上是從頭開始編寫,並且不使用任何庫的算法。)

基本上所有的算法確實是一串字符串處理的,名單和字典查找和數學。我的理解是,與CPython不同,Jython沒有GIL。

+0

我會檢查一下垃圾收集是否會在JVM級別傷害你。這個文檔有很多關於這方面的信息:http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html – 2010-11-19 22:54:03

回答

3

Jython沒有GIL,但獲得很多並行性非常困難。如果您有不能並行進行的任何部分,你被咬傷Ahmdahl's Law

使用多個處理器並行計算程序的加速是通過所需程序的順序部分的時間限制。

此外,即使您進行純粹的並行計算,您也會受到其他事物的困擾,例如緊張緩存。還要記住,你的代碼是在虛擬機的頂部運行的,所以即使你的代碼是純粹的並行的,JVM可能會有一些內部協調讓你迴避(垃圾收集是一個明顯的候選)。

4

訪問的變量是那些「隱藏」的瓶頸之一。如果所有線程都訪問某些共享數據結構,則線程之間會進行同步。

Jython盡力實現與CPython的語言兼容性。 GIL確保的一件事是訪問局部/全局變量,對象成員,字典元素(技術上來說局部變量,全局變量和對象成員也是字典元素),甚至列表元素都是原子的。爲了避免用戶感到意外,Jython使用併發哈希映射來實現字典。這意味着在訪問Jython中的任何類型的字典元素時會發生一些同步。這個sycnhronization是支持從多線程訪問字典而不阻塞它們的,但是如果多個線程訪問相同的變量,他們將會碰到相同的鎖。

實現Jython和任何其他語言的可伸縮性的最佳方法是確保您在每個線程中訪問的數據不會從其他線程訪問。

1

您是否嘗試過任何performance analysis軟件包?即使他們沒有明確地使用Jython,我敢打賭它會提供一些幫助。

如果您有權訪問許可證,我會首先嚐試YourKit