我试图使用boost.python将一段C++代码包装到python lib中,但是,我发现多个实例不能同时运行:
代码(C++):
class Foo{
public:
Foo(){}
void run(){
int seconds = 2;
clock_t endwait;
endwait = clock () + seconds * CLOCKS_PER_SEC ;
while (clock() < endwait) {}
}
};
BOOST_PYTHON_MODULE(run_test)
{
using namespace boost::python;
class_<Foo>("test", init<>())
.def("run", &Foo::run)
;
}
Run Code Online (Sandbox Code Playgroud)
这是使用CMake(CMake)编译的:
add_library(run_test SHARED run_test.cpp)
target_link_libraries(run_test boost_python python2.7)
Run Code Online (Sandbox Code Playgroud)
并使用以下代码(Python)进行测试:
class Dos(threading.Thread):
def run(self):
printl('performing DoS attack')
proc = test()
proc.run()
for i in range(5):
t = Dos()
t.start()
Run Code Online (Sandbox Code Playgroud)
输出表明代码以非常奇怪的方式并行化.每个线程应该只需要2秒钟,并且我的四核机器上应该同时运行4个线程:
[2011-11-04 13:57:01] performing DoS attack
[2011-11-04 13:57:01] performing DoS attack …Run Code Online (Sandbox Code Playgroud) 我有一个用C++编写的库,我使用SWIG包装并在python中使用.通常有一个类只有很少的方法.问题是调用这些方法可能很耗时 - 它们可能会挂起我的应用程序(调用这些方法时不会释放GIL).所以我的问题是:
为这些方法调用释放GIL的最简单方法是什么?
(据我所知,如果我使用了一个C库,我可以使用一些额外的C代码来包装它,但在这里我使用C++和类)