Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
boostpython睡眠包装器导致整个python程序睡眠_Python_Linux_Boost_Sleep_Thread Sleep - Fatal编程技术网

boostpython睡眠包装器导致整个python程序睡眠

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

我有一个多线程库,在其中调用不同的线程。 我已经使用boostpython为它编写了python绑定。 现在看起来,BoostPython在暂停整个python程序等待时,把sleep(3)函数弄糟了

请考虑我有这个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);
}