boostpython睡眠包装器导致整个python程序睡眠
我有一个多线程库,在其中调用不同的线程。 我已经使用boostpython为它编写了python绑定。 现在看起来,BoostPython在暂停整个python程序等待时,把sleep(3)函数弄糟了boostpython睡眠包装器导致整个python程序睡眠,python,linux,boost,sleep,thread-sleep,Python,Linux,Boost,Sleep,Thread Sleep,我有一个多线程库,在其中调用不同的线程。 我已经使用boostpython为它编写了python绑定。 现在看起来,BoostPython在暂停整个python程序等待时,把sleep(3)函数弄糟了 请考虑我有这个BooSt.MOD.CPP文件 #include <boost/python.hpp> using namespace boost::python; BOOST_PYTHON_MODULE( boostmod ) { def("waiter",&::sle
请考虑我有这个BooSt.MOD.CPP文件
#include <boost/python.hpp>
using namespace boost::python;
BOOST_PYTHON_MODULE( boostmod ) {
def("waiter",&::sleep);
}
这是一个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()”函数中阻塞。首先,我看到python中的
time.sleep
函数没有使用sleep(3)
systemcall。它使用(函数中的“floatsleep”)以便可以中断
然而,我还发现,如果在boost模块函数周围编写一个带有Py\u BEGIN\u ALLOW\u THREADS
和Py\u END\u ALLOW\u 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);
}
#包括
使用名称空间boost::python;
无效服务生(整数秒){
Py\u开始\u允许\u线程
::睡眠(秒);
Py\u端头\u允许\u螺纹
}
BOOST_PYTHON_模块(boostmod){
def(“服务员”&::服务员);
}
#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);
}