用Python和C api实现多线程 我有一个C++程序,使用C API使用我的Python库。 Python库和C++代码都是多线程的。p>
特别是C++程序的一个线程实例化一个Python对象,该对象继承自<代码>线程>线程< /代码>。我需要所有的C++线程能够调用该对象的方法。用Python和C api实现多线程 我有一个C++程序,使用C API使用我的Python库。 Python库和C++代码都是多线程的。p>,python,c++,multithreading,python-c-api,Python,C++,Multithreading,Python C Api,特别是C++程序的一个线程实例化一个Python对象,该对象继承自线程>线程< /代码>。我需要所有的C++线程能够调用该对象的方法。 从我的第一次尝试(我天真地只是从主线程实例化对象,然后等待一段时间,然后调用该方法)我注意到,只要执行返回到C++程序,Python线程与刚刚创建的对象的执行就停止。p> 如果执行与Python保持同步(例如,如果我调用代码> pyRun-SimuleStand(“Time.St入睡(5))),Python线程的执行将继续在后台进行,所有的工作都会很好,直到等待
从我的第一次尝试(我天真地只是从主线程实例化对象,然后等待一段时间,然后调用该方法)我注意到,只要执行返回到C++程序,Python线程与刚刚创建的对象的执行就停止。p>
如果执行与Python保持同步(例如,如果我调用代码> pyRun-SimuleStand(“Time.St入睡(5))),Python线程的执行将继续在后台进行,所有的工作都会很好,直到等待结束,执行返回到C++。
我显然做错了什么事。我应该做些什么来做<强> > <强>我的C++和Python多线程,并且能够很好地相互协作?我以前没有这方面的经验,所以请不要做任何假设 当您从python的
threading.Thread
回调时,可能没有解锁
好吧,如果您使用的是裸python的C API,那么关于如何发布/获取GIL。但是,在使用C++时,我必须警告您,在您的C++代码中抛出任何异常时,它可能会崩溃。p>
<>一般来说,运行任何时间的C++函数都应该打开吉尔和锁,每当它再次使用C Python API时,
正确执行你正在尝试做的步骤的顺序是:
- 在主线程中:
- 使用
初始化PythonPy\u Initialize*
- 使用
初始化Python线程支持PyEval\u InitThreads()
- 启动C++线程。
-
C++线程中的LI>:
- 使用
获取GIL李>PyGILState\u sure()
- 创建一个新的Python线程对象并启动它李>
- 使用
释放GILPyGILState\u Release()
- 睡眠、做一些有用的事情或退出线程
- 回到主线程:
- 释放GIL,使线程能够使用
PyEval\u SaveThread()
- 在尝试使用其他Python调用之前,请使用
PyEval\u RestoreThread()
我有一个很小但很完整的例子,正好可以做到这一点。很抱歉,我似乎没有完全理解这一点。以下是我所做的:1)PyGILState\u STATE;gstate=PyGILState_sure()2)创建从
threading.Thread
3)PyGILState\u Release(gstate)继承的python对象代码>4)睡眠几秒钟(在C++中)在run函数中,对象应该每隔一段时间打印一次,但它显然只在前几毫秒打印。我做错了什么。。?