在C++里使用多线程Python/C API,但是国内网站相关资料很少,故摸索出了一个简单例子。
Python/C API 的多线程分为两类,一类是用Python创建的多线程,一类是用其它语言(如C++)创建的多线程。
本篇博客仅仅讨论第一种情况,第二种情况可以参考C/C++ 多线程调用嵌入Python完整流程_pythonthreadlocker_好男孩朋友99的博客-CSDN博客
环境:已导入Python3库的Visual Studio 2019,Windows10。配环境教程可参考C++使用Python3的API_Eliza_Her的博客-CSDN博客
#include <Python.h>
#include <iostream>
#include <cstring>
using namespace std;
int main(int argc, char* argv[])
{
Py_Initialize(); /*初始化python解释器,告诉编译器要用的python编译器*/
// Python3.7及以后的版本,PyEval_InitThreads()已经被合并到Py_Initialize()里了,不需要手动调用
// 存储main State,最后也要在main State下Finalize
PyThreadState* _main = PyThreadState_Get();
// 创建第一个解释器状态
PyThreadState* state1 = Py_NewInterpreter();
// 在第一个解释器状态中执行一些代码
PyThreadState_Swap(state1);
PyRun_SimpleString("print('Hello from interpreter 1!')");
// 创建第二个解释器状态
PyThreadState* state2 = Py_NewInterpreter();
// 在第二个解释器状态中执行一些代码
PyThreadState_Swap(state2);
PyRun_SimpleString("print('Hello from interpreter 2!')");
// 切换回第一个解释器状态
PyThreadState_Swap(state1);
PyRun_SimpleString("print('Hello again from interpreter 1!')");
// 清理解释器状态1
Py_EndInterpreter(state1);
// 清理解释器状态2,清理前要切换到State2
PyThreadState_Swap(state2);
Py_EndInterpreter(state2);
// 切换回main
PyThreadState_Swap(_main);
Py_Finalize(); /*结束python解释器,释放资源*/
return 0;
}
输出:
这个例子只涉及非常基础的用法,更加深入的用法可以参考官方文档Initialization, Finalization, and Threads — Python 3.11.3 documentation