boost python sleep wrapper导致整个python程序进入睡眠状态

时间:2011-12-24 22:25:58

标签: python linux boost sleep thread-sleep

我有一个多线程库,我可以在不同的线程中调用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()”函数。

1 个答案:

答案 0 :(得分:1)

首先,我已经看到python中的time.sleep函数没有使用sleep(3)系统调用。它使用timing out call of select(2) on stdin(在函数“floatsleep”中),以便它可以被中断。

但是我也发现,如果你在boost模块函数周围写wrapper Py_BEGIN_ALLOW_THREADSPy_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);
}