2011-12-24 10 views
2

私はsleep(3)を別のスレッドで呼び出すマルチスレッドライブラリを持っています。 私は、pythonを使ってpythonバインディングを書いています。 これはboost pythonのように見えます。これは、pythonプログラム全体を待機させるためにsleep(3)関数を使いこなしています。boost python sleep wrapperが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 

あなたが「ブースト」の場合は、一つだけを持っている間に「ネイティブ」と「ctypesのは」本当に5つのスレッドプラスメインスレッドを構築していることがわかります糸。実際には "boost"の場合、 ".start()"は "sleep()"関数の中でブロックしています。

答えて

1

まず、time.sleepの機能が、sleep(3)システムコールを使用していないことがわかりました。それは中断することができるようにtiming out call of select(2) on stdin(関数 "floatsleep")を使用します。

しかし、あなたがをPy_BEGIN_ALLOW_THREADSPy_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); 
} 
は、
関連する問題