質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

2146閲覧

websocket-clientでの、on_message関数を並列処理する方法

okkotonushi89

総合スコア9

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/12/03 16:54

websocket-clientパッケージを用いて、随時送られてくるwebsocketデータを受信するプログラムを作成しているのですが、
on_message関数内の処理に時間がかかるため、処理中に次のデータが送られてきてしまう場合があります。

この場合、現在のon_message関数の処理が完了するまで次のon_message関数の実行を待機する挙動となっている認識です。

これを並列処理(on_message関数の完了を待たずに次のon_message関数を実行)させるにはどうすればよいでしょうか。

以下のようなコードを想定しています。

python

1class Test1(): 2 def __init__(self,host_adr): 3 print("### start ###") 4    self.ws = websocket.WebSocketApp(host_addr, 5 on_message=lambda ws, msg: self.on_message(ws, msg), 6 on_error=lambda ws, msg: self.on_error(ws, msg), 7 on_close=lambda ws: self.on_close(ws)) 8 self.ws.on_open = lambda ws: self.on_open(ws) 9 websocketThread = threading.Thread(target=self.run_forever, args=()) 10 websocketThread.start() 11 12 def on_message(self, ws, message): 13 (この部分の処理が時間がかかってしまうので、並列処理させたいです) 14 15 def on_error(self, ws, error): 16 print(error) 17 18 def on_close(self, ws): 19 print("### closed ###") 20 21 def on_open(self, ws): 22 thread.start_new_thread(self.run, ()) 23 24 def run(self, *args): 25 time.sleep(0.1) 26 input_data = (Websocket開始時に送るデータ) 27 self.ws.send(input_data) 28 29 def run_forever(self): 30 while True: 31 try: 32 self.ws.run_forever() 33 except Exception as e: 34 print(e) 35 time.sleep(3) 36 37if __name__ == '__main__': 38 HOST_ADDR = (WebSocket送信元) 39 ws_client = Test1(HOST_ADDR)

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

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

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

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

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

guest

回答1

0

Threadを使う代わりに、multiprocessingを使ってみてはいかがですか。

ProcessPoolExecutorを使う例がWebsockets and multiprocessingの回答に書かれています。

投稿2021/12/04 00:42

ppaul

総合スコア24670

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問