zoukankan      html  css  js  c++  java
  • C++多线程中调用python api函数

    错误场景:一直等待全局锁。

      

    解决方法:

    一、首先定义一个封装类,主要是保证PyGILState_Ensure, PyGILState_Release配对使用,而且这个类是可以嵌套使用的。

    #include <python.h>
    
    class PyThreadStateLock
    {
    public:
        PyThreadStateLock(void)
        {
            state = PyGILState_Ensure( );
        }
    
        ~PyThreadStateLock(void)
        {
             PyGILState_Release( state );
        }
    private:
        PyGILState_STATE state;
    };


    二、在主线程中,这样处理

       // 初始化
        Py_Initialize();
        // 初始化线程支持
        PyEval_InitThreads();
        // 启动子线程前执行,为了释放PyEval_InitThreads获得的全局锁,否则子线程可能无法获取到全局锁。
        PyEval_ReleaseThread(PyThreadState_Get());
        
        // 其他的处理,如启动子线程等
        ......
            
        // 保证子线程调用都结束后
        PyGILState_Ensure();
        Py_Finalize();
        // 之后不能再调用任何python的API

    三、在主线程,或者子线程中,调用python本身函数的都采用如下处理

        {
            class PyThreadStateLock PyThreadLock;  //获取全局锁
            // 调用python的API函数处理
            ......
        }
       //作用域结束,PyThreadLock析构,释放全局锁

     

  • 相关阅读:
    Java vs Python
    Compiled Language vs Scripting Language
    445. Add Two Numbers II
    213. House Robber II
    198. House Robber
    276. Paint Fence
    77. Combinations
    54. Spiral Matrix
    82. Remove Duplicates from Sorted List II
    80. Remove Duplicates from Sorted Array II
  • 原文地址:https://www.cnblogs.com/SZxiaochun/p/7692698.html
Copyright © 2011-2022 走看看