我目前正在使用Boost.Python,并希望得到一些帮助来解决一个棘手的问题.
上下文
当C++方法/函数暴露给Python时,它需要释放GIL(全局解释器锁)以让其他线程使用解释器.这样,当python代码调用C++函数时,解释器可以被其他线程使用.现在,每个C++函数看起来像这样:
// module.cpp
int myfunction(std::string question)
{
ReleaseGIL unlockGIL;
return 42;
}
Run Code Online (Sandbox Code Playgroud)
为了传递它来提升python,我做:
// python_exposure.cpp
BOOST_PYTHON_MODULE(PythonModule)
{
def("myfunction", &myfunction);
}
Run Code Online (Sandbox Code Playgroud)
问题
这个方案工作正常,但它暗示这module.cpp取决于Boost.Python没有充分理由.理想情况下,只python_exposure.cpp应该依赖Boost.Python.
解?
我的想法是用Boost.Function这样包装函数调用:
// python_exposure.cpp
BOOST_PYTHON_MODULE(PythonModule)
{
def("myfunction", wrap(&myfunction));
}
Run Code Online (Sandbox Code Playgroud)
这里wrap将负责在通话期间解锁GIL myfunction.这种方法的问题是wrap需要具有相同的签名,myfunction这几乎意味着重新实现Boost.Function...
如果有人对此问题有任何建议,我将非常感激.
我正在尝试一个以用户可以随时停止其执行而无需停止主程序的方式执行一段代码的程序。我以为我可以使用 threading.Thread 来做到这一点,但后来我在 IDLE (Python 3.3) 中运行了以下代码:
from threading import *
import math
def f():
eval("math.factorial(1000000000)")
t = Thread(target = f)
t.start()
Run Code Online (Sandbox Code Playgroud)
最后一行没有返回:我最终重新启动了 shell。这是全局解释器锁的结果,还是我做错了什么?我在线程文档中没有看到任何特定于此问题的内容(http://docs.python.org/3/library/threading.html)
我尝试使用流程做同样的事情:
from multiprocessing import *
import math
def f():
eval("math.factorial(1000000000)")
p = Process(target = f)
p.start()
p.is_alive()
Run Code Online (Sandbox Code Playgroud)
最后一行返回 False,即使我在启动该过程后仅几秒钟就运行了它!根据我的处理器使用情况,我被迫得出结论:该过程从一开始就从未启动过。有人可以解释一下我在这里做错了什么吗?