python扩展执行或构建的奇怪时间增强.python带螺纹=sing

2024-04-25 21:05:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我的python扩展使用增强.python图书馆。也就是说,在代码中:

import my_ext

j = 0
while j<5:
    print j
    my_ext.do_something(j)
    j = j + 1

我没有看到j被打印出来,而扩展代码(my_ext.do_something(j))正在为不同的j做一些工作(比如打印第j个文件)。此外,它只打印两个文件j=0和j=1,然后整个脚本完成没有错误或其他通知。你知道吗

所有这些让我觉得代码是并行执行的(多线程),但是没有正确处理这样的parallelizm。我想这可能与增强.python我构建的库在默认情况下是使用--threading=multi选项创建的。但是,尝试使用选项--threading=single重建不会产生任何效果,它仍然是作为多线程库构建的。这个posthttp://mail.python.org/pipermail/cplusplus-sig/2010-October/015771.html报告了类似的构建过程问题,但是没有得到回答。你知道吗

所以我的问题是如何建立boost库和增强.python尤其是单螺纹。或者,该问题可能与的单线程/多线程以外的内容有关增强.python图书馆。你知道吗

附加信息:我使用的是cygwin,boost_1.50.0,python2.6,我的操作系统是win7,带有多核CPU和nvidiavram(后两种硬件都支持多线程执行我的扩展而不让我知道)。你知道吗


Tags: 文件代码import脚本图书馆my选项plus
1条回答
网友
1楼 · 发布于 2024-04-25 21:05:52

你知道吗Boost.Python版本在Boost构建系统中往往是一个特例,因为它与为其构建Python的Python版本和配置相耦合。例如,如果Python是在没有调试的情况下构建的,那么Boost.Python版本即使Boost被明确告知构建一个调试变量,也将在不进行调试的情况下构建。我相信线程属性也是如此,因为它将通过包含Python.h间接地包含pyconfig.h。你知道吗

Python默认在单个线程中运行程序,而不管Python是否是使用线程支持构建的。Boost.Python版本不会改变此行为。作为一般的经验法则,线程只会成为Boost.Python版本当一个人想要并发的时候。例如,如果my_ext.do_something()要将一个大文件读入内存,那么最好在不持有lock on the interpreter的情况下执行读取。你知道吗

考虑从扩展的简化实现开始,然后扩展它。例如,当我将my_ext构建为:

#include <iostream>
#include <boost/python.hpp>

void do_something(unsigned int j)
{
  std::cout << "do_something(): " << j << std::endl;
}

BOOST_PYTHON_MODULE(my_ext)
{
  namespace python = boost::python;
  python::def("do_something", &do_something);
}

我的测试脚本:

import my_ext

for j in xrange(5):
    print j
    my_ext.do_something(j)

产生:

0
do_something(): 0
1
do_something(): 1
2
do_something(): 2
3
do_something(): 3
4
do_something(): 4

另一种方法是构建Python和Boost.Python版本,然后使用调试器逐步完成程序。有关调试构建的更多信息可以在here中找到。你知道吗

相关问题 更多 >