🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

1339閲覧

threadingを用いた場合にプログラムが並列処理しているか確認する方法について

yohehe

総合スコア48

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/11/18 07:09

編集2019/11/18 08:58

pythonを用いた並列処理のthreadingの手法について勉強しています。
threadingを用いた場合のコードを作成してみたのですが、
以下のようにif文にthread2での動作のコードを格納した場合に、並列で処理されているのかわからないで困っています。
並行で処理されているか確認できる方法はありますでしょうか。

threadingの手法についても使い方が間違っていましたらご指摘、アドバイスいただけますと幸いです。よろしくお願いします。

python

1 2import time 3import threading 4 5#thread処理のテスト 6 7def multi_test(): 8 count=0 9 for i in range(50): 10 print(count) 11 if count%3 ==0 : 12    #並列処理2を行う 13 test2() 14 count = count+1 15 else: 16 count = count+ 1 17 return 18 19def test2(): 20 print("thread2出力") 21 22#出力確認 23if __name__ == "__main__": 24 thread_1 = threading.Thread(target=multi_test()) 25 thread_2 = threading.Thread(target=test2()) 26 27 thread_1.start() 28 thread_2.start() 29コード

以下追記いたしました。どのようなコードにthreading処理を組み込みたいかについてです。

以下のようにcv2を用いてPCにおいて画面表示をしながら、任意のフレーム数をリストに格納し、格納したデータについてthreading処理を並列で処理したいと考えています。その際に画面のカメラ画像を止めずにバックグラウンドで処理したいのですが、今のところ試してはいるのですが、画面表示がやや止まる印象がありますので質問させていただきました。

python

1import numpy as np 2import cv2 3import matplotlib.pyplot as plt 4import time 5#カメラを設定 6cap = cv2.VideoCapture(0) 7frame_width = int(cap.get(3)) 8frame_height = int(cap.get(4)) 9 10#mp4で保存するため、以下を設定 11out = cv2.VideoWriter('test_.mp4',cv2.VideoWriter_fourcc('M','P','4','V'), 30, (frame_width,frame_height)) 12 13 14count=0 15frames_list=[] 16#--------------------------------- 17while(True): 18 ret, frame = cap.read() 19 if ret == True: 20 21 # Write the frame into the file 'output.avi' 22 #out.write(frame) 23 24 # Display the resulting frame 25 cv2.imshow('frame',frame) 26 27 #----------------------------------------------------------------- 28 #50フレーム格納すると処理を行うプログラムを実行する。 29 frames_list.append(frame) 30 count = count + 1 31 if count == 50: 32 33 print("150フレーム分取得,predict開始") 34 time_sta=time.time() #時間を計測する 35 frames_extracted=np.array(frames_list) 36 37 #------------------------------------------ 38 #ここで取得したframe_listに対して並列処理を行いたいです。 39 #------------------------------------------ 40 41 42 #処理が終了したため、frames_listを空にする 43 frames_list=[] 44 print("listを空にしました",len(frames_list)) 45 #countを0に戻す 46 count=0 47 48 # Press Q on keyboard to stop recording 49 if cv2.waitKey(1) & 0xFF == ord('q'): 50 break 51 52 # Break the loop 53 else: 54 break 55 56# When everything done, release the video capture and video write objects 57cap.release() 58out.release() 59 60# Closes all the frames 61cv2.destroyAllWindows() 62

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2019/11/18 08:40

pythonでのスレッド処理がイメージ通り動作するか微妙な感じなので、どのようなことをしたいのかを提示した上で、実現できるか否かを判断する方向で質問した方が適切な回答を得られやすいようにおもわれます。
yohehe

2019/11/18 08:50

opencvでカメラを起動ながら、カメラから任意の時間内のイメージ画像を取得した場合に、並列でthreadingで処理したいと考えています。 その際にカメラから取得した画像を流したままにしたいと考えているのですが、threading2が起動した場合にカメラのimshow()が止まった感じになるため、それをthreadingで解決したいと考えています。 ご指摘ありがとうございます。
yohehe

2019/11/18 08:52

上記のスレッド処理がイメージ通りに動作しない可能性があるとのアドバイスですが、どのあたりのプログラム処理が微妙になってくるのか教えていただけますと幸いです。
guest

回答2

0

ベストアンサー

pythonではGILと呼ばれる機構があり、IOなどの待ちのために遅くなる場合を除き、スレッドを利用した並列処理はできません。カメラからデータを取り込み、画像にフィルタなどの処理を施す場合、恐らくカメラ入力の待ちはわずかなIO時間しかとらず、ほぼCPU時間だと思われるため、所望の動作はしないでしょう。

参考:
https://qiita.com/simonritchie/items/1ce3914eb5444d2157ac

マルチプロセスにしてみるというてもあるかと思いますが、画像データのコピーが
発生するので、どの程度効率的に動作するかはわかりません。
ただ、通常の画像処理は縮小しても動作することがよくあるので、画像をキャプチャ・縮小し、その後を別のプロセスで処理をするという流れが良いのではないでしょうか。
(試していないのでうまく動作しないかもしれませんし、メモリなどのスペックで
動作が変わるかもしれません)

投稿2019/11/18 09:18

t_obara

総合スコア5488

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yohehe

2019/11/18 09:50

アドバイスありがとうございます。今の知識ではすべて理解できておりませんが、、、マルチプロセスはwindowsとjupyter labを使用している場合使えなさそうなので、pythonの構造上難しいのですね。キャプチャと縮小してできるだけラグがないような動作が可能かやってみます。 参考サイトの情報を勉強して、代用の方法・解決案などがないか考えてみます。 本当にありがとうございます。
guest

0

双方のスレッドで、てきとーに何かを定期的にprintしてみてはどうでしょう

投稿2019/11/18 07:38

編集2019/11/18 07:39
y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yohehe

2019/11/18 07:41

返信ありがとうございます。 上記だと、 0 thread2出力 1 2 3 thread2出力 4 5 6 thread2出力...と続いていくのですが、並列処理ができているとすると、横並びに出力するものなのでしょうか。すみません。
y_waiwai

2019/11/18 07:43

ちゃんと双方出力されてますんで、ちゃんと動いてることがわかりますね
yohehe

2019/11/18 07:50

動作するということは、並列に処理されている認識で良いということでしょうか。何度も質問すみません。 親のthreadの中のif文内にthread2を入れる際は違う書き方が必要なのか色々と調べてはいるのですが。。
y_waiwai

2019/11/18 08:02

並列に動作していなければありえない出力となってますんで、それでいいとおもいますよ
yohehe

2019/11/18 08:45

ありがとうございます。この書き方ですすめてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問