Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Python和C api实现多线程 我有一个C++程序,使用C API使用我的Python库。 Python库和C++代码都是多线程的。p>_Python_C++_Multithreading_Python C Api - Fatal编程技术网

用Python和C api实现多线程 我有一个C++程序,使用C API使用我的Python库。 Python库和C++代码都是多线程的。p>

用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对象,该对象继承自<代码>线程>线程< /代码>。我需要所有的C++线程能够调用该对象的方法。

从我的第一次尝试(我天真地只是从主线程实例化对象,然后等待一段时间,然后调用该方法)我注意到,只要执行返回到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时,

正确执行你正在尝试做的步骤的顺序是:

  • 在主线程中:

  • 使用
    Py\u Initialize*
    初始化Python
  • 使用
    PyEval\u InitThreads()
    初始化Python线程支持
  • 启动C++线程。
此时,主线仍然持有GIL

    C++线程中的LI>:
  • 使用
    PyGILState\u sure()
    获取GIL
  • 创建一个新的Python线程对象并启动它
  • 使用
    PyGILState\u Release()
    释放GIL
  • 睡眠、做一些有用的事情或退出线程
因为主线程持有GIL,所以该线程将等待获取GIL。如果主线程调用pythonapi,它可能会不时释放GIL,允许Python线程执行一段时间

  • 回到主线程:
  • 释放GIL,使线程能够使用
    PyEval\u SaveThread()
  • 在尝试使用其他Python调用之前,请使用
    PyEval\u RestoreThread()
我怀疑您错过了最后一步——在主线程中释放GIL,允许Python线程执行


我有一个很小但很完整的例子,正好可以做到这一点。

很抱歉,我似乎没有完全理解这一点。以下是我所做的:1)PyGILState\u STATE;gstate=PyGILState_sure()2)创建从
threading.Thread
3)
PyGILState\u Release(gstate)继承的python对象4)睡眠几秒钟(在C++中)在run函数中,对象应该每隔一段时间打印一次,但它显然只在前几毫秒打印。我做错了什么。。?