2010-10-15 173 views
1

我試圖在一個模塊中使用Python的汽車總線系統的分析軟件。爲此,我必須以線程安全的方式嵌入Python,因爲可以有多個獨立工作的模塊實例。我可以使用一個互斥體來保護對Python的所有訪問,併爲每個線程創建一個唯一的(python)模塊。顯然,這是最簡單的方法,但不能跨多個核心進行擴展。或者我可以修改我的模塊以產生新的進程,這些進程使用Python並通過共享內存連接到它們。這給我一個性能損失,需要花費更多時間來實現,但規模很大。嵌入Python線程安全

我的問題:女巫你認爲更有意義嗎?有沒有其他方法可以安全地嵌入Python線程,甚至可以通過擴展多個內核的方式來嵌入Python線程。

親切的問候莫里茨

編輯:我使用的是CPython的

+2

這取決於你在Python中做的東西有多複雜,但在一般情況下,我會說使用多個解釋器是正確的方法。它將大大提高靈活性和可伸縮性(同時讓你在GIL周圍),而且你不需要每個線程模塊。我認爲你的項目的其他開發人員可以更容易地獲得結果,而且更通用。 – Olson 2010-10-15 17:03:04

+0

嗨Jagerkin如果你再次發表你的評論作爲答覆,我會接受它。 – JustMaximumPower 2010-10-19 07:36:40

+1

@Jagerkin:這正是'multiprocessing'庫的功能。同時生成兩個Python解釋器並不像最初聽起來那麼簡單,因爲您將不得不關注進程/線程同步和線程間/進程間通信。多處理庫已經爲你做了大部分的努力工作,它有「隊列」,「管道」,「池」,「共享值」的多進程版本,透明地對IPC /共享內存上的對象進行序列化和反序列化,以及「鎖定」通過多次處理同步,這樣你就不必自己做。 – 2010-10-19 11:10:20

回答

3

如果你是CPU綁定,Python可以只規模,使用多庫中的多個核心。但是,如果你是I/O綁定的,那麼線程通常就足夠了。

如果你想要簡單的線程安全,那麼使用隊列來傳遞所有消息。

+0

多處理庫真的幫助我嗎?我不在一個Python解釋器中使用多個線程,我想使用多個(C++)線程中運行的多個Python解釋器。 – JustMaximumPower 2010-10-15 14:32:27

+0

多處理庫可以處理產卵子進程(即它產生多個python解釋器)和進程間通信(例如數據共享,同步),並且這樣做可以避免GIL(全局解釋器鎖)。我建議在嘗試在C++線程上產生多個解釋器(它將複製它們在多處理庫中的大部分內容)之前查看它。 – 2010-10-15 14:39:24

+0

同樣,我不希望從Python內部支持進程,如果有的話,我想從C中產生新的進程。那麼你是否建議我查看多進程源代碼?或者多處理庫如何幫助我?我並不想自大,但我不明白你的回答對我有何幫助。 – JustMaximumPower 2010-10-19 07:55:57