2010-05-12 49 views
2

假設我有一個C(++)函數取一個整數,並且它與python api綁定到(C)python,所以我可以從python調用它:使用線程在python中調用多個C++函數

import c_module 
c_module.f(10) 

現在,我想並行化它。問題是:在這種情況下GIL如何工作?假設我有一個要處理的數字隊列,一些工作者(threading.Thread)並行工作,每個工作者都調用c_module.f(number),其中number是從隊列中獲取的。

當GIL鎖定解釋器時,與通常情況的區別在於,現在您不需要解釋器來評估c_module.f,因爲它已編譯。所以問題是:在這種情況下,處理是否真的平行?

+0

我不認爲通過在python中使用線程會得到很多速度。一個更好的方法是使用OpenMP來並行化數字處理fortran函數並將其與向量化數據一起調用。 – 2010-05-12 21:38:33

回答

3

當前正在執行GIL明確發佈的C擴展代碼的線程將並行運行。請參閱http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock瞭解您的擴展需要做什麼。

Python線程對於I/O綁定執行或GUI響應性最有用。我不會用線程執行python繁重的執行。如果你想保證並行性,請查看multiprocessing庫。

+0

python中的多處理對我的問題不是很好,因爲每個'f'函數都需要返回一個龐大的浮點數矢量,並且沒有共享內存,所以它可能非常昂貴 – 2010-05-13 08:02:15

+0

是c_module代碼嗎?如果是這樣,你是否在處理密集型部分釋放GIL? – 2010-05-13 12:13:53

+0

是的,這是我的代碼,但我不知道如何放棄GIL。如果我這樣做,我的C++函數將運行而不會出現GIL問題嗎? – 2010-05-13 13:06:06

相關問題