我尝试在boost::Python的Python解释器中运行并发的Python脚本。下面是一个简短的程序示例:#include
#include
#include
#include
#include
#include
#include
int main(int argc, char const *argv[]) {
const char *prog = "def ack(m, n):\n"
" if m == 0:\n"
" return n + 1\n"
" elif n == 0:\n"
" return ack(m - 1, 1)\n"
" else:\n"
" return ack(m - 1, ack(m, n - 1))";
Py_Initialize();
try {
std::thread t1([&prog]() {
std::cout << "t1" << std::endl;
boost::python::object mainModule = boost::python::import("__main__");
boost::python::object mainNamespace = mainModule.attr("__dict__");
boost::python::exec(prog, mainNamespace, mainNamespace);
int val = boost::python::extract(
boost::python::eval("ack(3,3)", mainNamespace, mainNamespace));
std::cout << "t1 result: " << val << std::endl;
});
std::thread t2([&prog]() {
std::cout << "t2" << std::endl;
boost::python::object mainModule = boost::python::import("__main__");
boost::python::object mainNamespace = mainModule.attr("__dict__");
boost::python::exec(prog, mainNamespace, mainNamespace);
int val = boost::python::extract(
boost::python::eval("ack(3,4)", mainNamespace, mainNamespace));
std::cout << "t2 result: " << val << std::endl;
});
t1.join();
t2.join();
} catch (boost::python::error_already_set const &e) {
PyErr_Print();
}
return 0;
}
问题是程序间歇性地失败。我在两个不同的Linux系统上尝试过。一方面,它失败的次数约为3/4;另一方面,失败的次数约为1/10。最常见的失败案例是以下几点:
^{pr2}$
在Boost Pythnon文档中有几个诱人的调用提到了concurrency,但是这些组合我都没有尝试过。{{a1}(吉尔)似乎被设计成允许C++访问相同的EEE> Python解释器线程,除非我误解了它。我想要两个完全独立的Python解释器同时运行。在
This example很接近,但是使用两个单独的C线程,它们偶尔调用Python来做一些工作。我试图同时运行两个独立的Python进程。在
This question与此类似,尽管它提供的细节较少。在我的例子中,Python解释器是用来把在超级计算机上运行相当长时间的外部进程联系起来的,它们不需要回调到我的C++应用程序中。一旦完成,结果被收集和显示从外部删除文件的C++应用程序。在