哎呀,约翰是科伦特。我们从未找到在Boost Python中运行两个并发Python项目的方法。有三种方法可以回避这个问题。这是第一个:运行两个
不同的
#include <Python.h>
#include <boost/python/exec.hpp>
#include <iostream>
#include <thread>
#include <sys/wait.h>
#include <boost/python/extract.hpp>
#include <boost/python/import.hpp>
#include <boost/python/object.hpp>
void python (std::string fork, int m, int n) {
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::cout << fork << std::endl;
boost::python::object mainModule = boost::python::import("__main__");
boost::python::object mainNamespace = mainModule.attr("__dict__");
std::stringstream commandstream;
commandstream << "ack(" << m << "," << n << ")";
std::string command = commandstream.str();
boost::python::exec(prog, mainNamespace, mainNamespace);
int val = boost::python::extract<int>(boost::python::eval(command.c_str(), mainNamespace, mainNamespace));
std::cout << fork << " result: " << val << std::endl;
} catch (boost::python::error_already_set const &e) {
PyErr_Print();
}
}
int main (int argc, char const *argv[]) {
pid_t pid = fork();
if (pid == 0) {
python("f1", 3, 4);
} else if (pid > 0) {
python("f2", 3, 3);
int status;
waitpid(pid, &status, 0);
} else {
std::cout << "Fork failed." << std::endl;
}
return 0;
}
第三种方法是阻塞线程,直到第一个Python进程完成。如果每个Python进程都需要很短的时间,那么这是可行的,但在我们的应用程序中不是这样的,所以我们拒绝了这个替代方案。