python并发删_两个并发的Python进程可以在boostpython中运行吗?

博客探讨了尝试在C++中使用Boost.Python库并发运行Python脚本时遇到的问题。作者指出,程序间歇性失败,特别是在两个Linux系统上,失败率不一。常见错误涉及Python解释器的并发使用。博客内容提及了Boost.Python文档中关于并发的提及,以及尝试使用线程和独立Python解释器的可能性。目标是实现两个完全独立的Python解释器同时运行,用于协调超算上的长期外部进程。
摘要由CSDN通过智能技术生成

我尝试在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++应用程序。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值