【发布时间】:2019-07-23 11:03:02
【问题描述】:
找到了几个类似的主题,但没有任何帮助。
基本上,我有一个 C++ 应用程序,它想从 Python 脚本调用一个函数。这一切都很好。
但是因为我需要它在一定程度上实时工作并且 python 函数需要一点时间,所以我想添加多线程。
基本上是两种情况之一:
- C++ 中的线程池,每个线程都将调用 Python 函数。
或
- Python 中的线程池,C++ 应用正在将任务添加到 Python 队列中。
我更喜欢第一个选项,所以让我们开始吧。基本上,我有一个带有函数的python脚本(实际上,有一个Tensorflow预测):
import time
def pfoo(msg):
print("Python >> Function called)
time.sleep(2)
print("Python << Function finished)
还有一个 C++ 线程池(大部分取自 here):
ThreadPool pool(4);
// initialize the Python
Py_Initialize();
// initialize thread support
PyEval_InitThreads();
// ...
PyObject* m_PyModule = PyImport_ImportModule( "test" );
PyObject* m_PyDict = PyModule_GetDict( m_PyModule );
PyObject* m_PyFoo = PyDict_GetItemString( m_PyDict, "pfoo" );
for ( int i = 0; i < 10; i++ ) {
pool.enqueue( [&] {
PyEval_CallObject( m_PyFoo, Py_BuildValue( "(s)", arg ) );
} );
}
正如您可以想象的那样,什么都没有发生,因为您不能在同一函数仍在运行时调用它。
我尝试了Py_BEGIN_ALLOW_THREADS 宏,我尝试了PyGILState_Ensure() 和this 更复杂的选项。我没有想法。
尝试了第二种情况,我在 Python 中有一个无限循环线程,它从 queue.Queue() 读取任务并将它们放入 ThreadPoolExecutor,然后 C++ 应用程序调用一个函数将任务添加到上述队列。对我也不起作用(如果我只是在 Python 中运行它就可以,但如果嵌入到 C++ 中就不起作用)。
【问题讨论】:
-
如果每个线程运行一个单独的 Python 解释器,并且可以调用相同的函数但它们不能相互交互,对您来说可以吗?在 Python 中使用多处理怎么样?
-
@JohnZwinck 我想过,但由于我需要加载一个 Tensorflow 模型并分配几 GB 的 GPU 内存来使用它,这可能很快就会出现问题。
标签: python c++ multithreading