こんにちは。Boost.Pythonを用いてC++で.pydファイルを作り、それをPythonの本スレッドとは別のスレッドで平行して起動することを試みています。ところが、C++で作った関数をスレッドで呼び出すと、他のスレッドが停止してしまいます。
pythonのコードです。このコードでは関数thread1, thread2を同時に実行することを試みています。関数Outer.InfLoopは延々と"out"を表示するものです。
Python
1import Outer 2 3def thread1(): #1秒おきに0から4まで表示するスレッド 4 for i in range(5): 5 print(i) 6 time.sleep(1) 7 8 9def thread2(): #外部プログラムを実行するスレッド 10 Outer.InfLoop() #1秒おきに5回"out"と表示する関数(C++で作られた) 11 12 13th1 = threading.Thread(target=thread1) 14th2 = threading.Thread(target=thread2) 15th1.start() 16th2.start()
C++のコードです。これをビルドしてOuter.pydができます。OuterをimportすることでPython上で関数Outer.InfLoop()を呼び出すことができます。
C++
1#include <boost/python/numpy.hpp> 2namespace p = boost::python; 3 4void InfLoop(){ //1秒おきに5回"out"と表示する関数 5 for (int i = 0; i < 5; i++) { 6 cout << "out" << endl; 7 Sleep(1000); 8 } 9 return; 10} 11 12BOOST_PYTHON_MODULE(Outer) { 13 Py_Initialize(); 14 p::def("InfLoop", InfLoop); //関数InfLoopはPython上で"Outer.InfLoop()"で呼び出すことができる。 15}
Pythonコードを実行すると、thread1とthread2は同時に実行されるはずですから、iと"out"が交互に表示されることが期待されます。しかし、実際には最初に0が表示された後outが5回続いてから数字が続きます。つまり、thread2が実行されている間thread1は停止していることになります。原因がわからず困っています。よろしくお願いします。
期待 | 実際 |
---|---|
0 | 0 |
out | out |
1 | out |
out | out |
2 | out |
out | out |
3 | 1 |
out | 2 |
4 | 3 |
out | 4 |
回答3件
あなたの回答
tips
プレビュー