私は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()"関数の中でブロックしています。