Thread safe tips for python extending

來源:互聯網
上載者:User
 
     其實習慣了用python寫一些單線程的擴充,所以一直沒有遇到這種問題

     今天在寫一個python的擴充模組的時候遇到一個問題. 通過 python啟動了一個c++的線程,這個c++線程會回調python的一個介面.調試了很久一直沒有意識到是安全執行緒的原因,因為 c++的線程在調用  python的vm的pyobject時.並不是安全執行緒的.所以當c++線程直接去操作 vm的某一個object就很有導致出錯.
   
     我搜尋了資料 在 http://www.python.org/dev/peps/pep-0311/ 有講到如何同步python的vm. 有兩個函數可以做到鎖定vm,與c++線程同步.也就是所謂的 GIL(Global Interpreter Lock).
    有兩種方法來做到: 
    1 .Py_BEGIN_ALLOW_THREADS,Py_END_ALLOW_THREADS 這一對宏
    2. PyGILState_Ensure 與 PyGILState_Release
 
    不過似乎我的Py_BEGIN_ALLOW_THREADS不太好用,我也就沒有去深究,因為PyGILState_Ensure就夠了.沒有太多的時候去研究文檔,先用了回過頭有時間再研究.
  
   看看我的範例程式碼:

#include "Python.h"
#include "ceval.h"

class PyGILHelper
{
public:
   PyGILHelper():
   mState (PyGILState_Ensure())
   {
   }
   ~PyGILHelper()
   {
      PyGILState_Release(mState);
   }
protected:
   PyGILState_STATE mState;
};

用法很簡單:

PyGILHelper lock;
// some c api code

   

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.