2

異なるスレッドでsleep(3)を呼び出すマルチスレッドライブラリがあります。Boostpythonを使用して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」の場合は1つのスレッドしかないことがわかります。実際、「ブースト」の場合、「。start()」は「sleep()」関数内でブロックされています。

4

1 に答える 1

1

まず第一にtime.sleep、Pythonの関数がシステムコールを使用していないことを確認しsleep(3)ました。onのタイムアウト呼び出しselect(2)stdin(関数「floatsleep」内)を使用して、中断できるようにします。

ただし、ブーストモジュール関数を使用してラッパーを作成するPy_BEGIN_ALLOW_THREADSと、現象が解消されるように見えることもわかりました。Py_END_ALLOW_THREADS

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);
}
于 2011-12-25T15:57:08.963 に答える