程序员

多线程下,C++如何调用Python脚本的方法

2020-05-02  本文已影响0人  JasonLiThirty

视频教程:多线程场景下,用C++调用Python脚本的方法

Git: https://github.com/JasonLiThirty/C-andPython

接口函数

Python3.6提供给C/C++接口函数,基本都是定义pylifecycle.h,pythonrun.h,ceval.h中。

Py_Initialize() 和 Py_Finalize()

Py_IsInitialized()

PyErr_Print() & PyErr_Clear()

PyRun_SimpleString()

PyEval_InitThreads()

PyEval_AcquireLock() & PyEval_ReleaseLock()

PyThreadState对象及其相关函数

每个Python 线程都需要维护自己的状态信息,在被Python解释器执行时,需要先切换线程的状态信息,才可以开始执行相应的代码,这个线程状态信息就是用PyThreadState这个对象来描述的。

以下是几个进阶的接口函数,这些函数可以将全局解释器的加锁和释放锁的操作,以及线程切换的操作封装起来,比较方便。

PyEval_AcquireThread(PyThreadState *tstate)

PyEval_ReleaseThread(PyThreadState *tstate)

PyGILState_STATE state = PyGILState_Ensure()

PyGILState_Release(PyGILState_STATE state)

PyGILState_Ensure() 和 PyGILState_Release()需要成对出现,仅在CPython中有效,这样就能实现Python解释器的锁功能。只有在关闭Python的使用环境时,可以不再需要调用PyGILState_Release()函数

示例代码

Git: https://github.com/JasonLiThirty/C-andPython

PyInvoker

面向对象的方法实现Python解释器的管理和与Python脚本交互的实现。

PyLock

运用PyGILState_Acqsuire和PyGILState_ReleasePython的Global Interpreter Lock,来实现多线程之间数据完整性和状态同步,GIL机制能保证在任意时刻只有一个线程在解释器中运行,效率上会有一定的损失。

PythonGreet.py

def Hello(): print('Hello world!!!')

PythonCalc.py

def Add(num1, num2): return num1+num2

上一篇 下一篇

猜你喜欢

热点阅读