我有一个多线程库,我可以在不同的线程中调用sleep(3)。 我使用boost python为它编写了python绑定。 现在看起来boost python正在搞乱sleep(3)函数,因为它暂停整个python程序等待。
请考虑我有这个boostmod.cpp文件
#include <boost/python.hpp>
using namespace boost::python;
BOOST_PYTHON_MODULE( boostmod ) {
def("waiter",&::sleep);
}
(您可以使用以下方法编译它)
$ g++ -fPIC -shared boostmod.cpp `python-config --cflags --libs` -lboost_python -o boostmod.so
这是一个python测试文件threadtest.py:
import time,sys,threading,boostmod
from ctypes import *
if __name__ == '__main__':
libc = CDLL("libc.so.6") # this only works in linux
for n in range(5):
if sys.argv[1] == "boost":
# this is slow
threading.Thread(target=boostmod.waiter,args=(3,)).start()
elif sys.argv[1] == "native":
# this is fast
threading.Thread(target=time.sleep,args=(3,)).start()
elif sys.argv[1] == "ctypes":
# this is fast
threading.Thread(target=libc.sleep,args=(3,)).start()
结果如下:
$ time python threadtest.py boost
real 0m15.030s
user 0m0.024s
sys 0m0.005s
$ time python threadtest.py native
real 0m3.032s
user 0m0.027s
sys 0m0.003s
$ time python threadtest.py ctypes
real 0m3.030s
user 0m0.022s
sys 0m0.008s
如果您观察到以下情况:
$ watch -n1 ps -C python -L -o pid,tid,pcpu,state
你可以看到“native”和“ctypes”实际上构建了5个线程加上主线程,而“boost”情况只有一个线程。实际上在“boost”情况下,“。start()”阻塞了“sleep()”函数。
答案 0 :(得分:1)
首先,我已经看到python中的time.sleep
函数没有使用sleep(3)
系统调用。它使用timing out call of select(2)
on stdin
(在函数“floatsleep”中),以便它可以被中断。
但是我也发现,如果你在boost模块函数周围写wrapper Py_BEGIN_ALLOW_THREADS
和Py_END_ALLOW_THREADS
,这种现象似乎就会消失。
所以这是新的boost模块代码,允许使用sleep(3)
调用进行多线程处理:
#include <boost/python.hpp>
using namespace boost::python;
void waiter(int seconds) {
Py_BEGIN_ALLOW_THREADS
::sleep(seconds);
Py_END_ALLOW_THREADS
}
BOOST_PYTHON_MODULE( boostmod ) {
def("waiter",&::waiter);
}