2009-09-09 82 views

回答

5

這一切都取決於您的Cython代碼和Python的GIL之間的交互,詳細記錄here。如果你沒有做任何特別的事情,那麼Cython生成的代碼將會尊重GIL(就像一個不使用GIL釋放宏的C編碼擴展)。它使得這樣的代碼「像Python代碼一樣線程安全」 - 這並不多,但比完全自由線程代碼更容易處理(您仍然需要構建多線程合作和同步,理想情況下使用Queue實例,但可能與鎖定& c)。

已放棄GIL並且尚未獲得它的代碼絕不能以任何方式與Python運行時和Python運行時使用的對象進行交互 - 這適用於Cython以及C代碼擴展。當然,這樣的代碼可以在單獨的核心上運行(當然,它需要同步或以任何方式再次與Python運行時進行通信)。

2

Python的全局解釋器鎖意味着,只有一個線程可以在任何一個時間解釋活動的。但是,一旦控制傳遞給C擴展,另一個線程可以在解釋程序中處於活動狀態,可以創建多個線程,並且不會阻止線程在臨界區中間被中斷。代碼可以在解釋器中實現,所以在解釋器中運行的代碼沒有任何內在線程安全的問題,C或Pyrex模塊中的代碼仍然可以修改數據結構python代碼可見。本機代碼當然也可能具有本機數據結構的線程問題。

除了使用適當的設計和同步之外,不能保證線程的安全性 - python解釋器上的GIL並沒有實質性地改變它。