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

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

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

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

Python

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

Q&A

解決済

1回答

4219閲覧

websocketのon_message関数に変数を渡す

taro_yamada

総合スコア55

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

Python

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

0グッド

0クリップ

投稿2020/11/15 12:49

今、websocketを使ってメッセージを取得し、その都度加工するプログラムを書いています。

以下のように、on_messageの引数に変数を追加したいのですが、可能でしょうか?

def on_message(ws, message, signal):

<その他気になっていること>
そもそも、websocketを使ったプログラミングの基本として、def on_messageの中で複雑な処理をしない方がいいような気がしているのですが、その他の方法を見つけることができませんでした。
もし、良い方法をご存じの方がいれば、ご教示ください。

python

1import sys 2import websocket 3import _thread 4 5def on_message(ws, message): 6 # 今はこの関数の中でmessageの加工を行っている。 7 print('--- RECV MSG. --- ') 8 print(message) 9 10def on_error(ws, error): 11 print('--- ERROR --- ') 12 print(error) 13 14def on_close(ws): 15 print('--- DISCONNECTED --- ') 16 17def on_open(ws): 18 print('--- CONNECTED --- ') 19 def run(*args): 20 while(True): 21 line = sys.stdin.readline() 22 if line != '': 23 print('closing...') 24 ws.close() 25 _thread.start_new_thread(run, ()) 26 27url = 'ws://*****/****/websocket' 28# websocket.enableTrace(True) 29ws = websocket.WebSocketApp(url, 30 on_message = on_message, 31 on_error = on_error, 32 on_close = on_close) 33ws.on_open = on_open 34ws.run_forever()

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問者様が感じられていますように、websocketをつなぎっぱなしにして、来るメッセージに処理をしていく、というプログラムをエレガントに書く方法は悩ましいです。on_messageはコールバックとしてライブラリに規程されているため、おそらく引数を追加することはできないのではないでしょうか。また、on_messageに複雑な処理は書くなとは決まっていませんが、なんとなく複雑な処理を書くのは憚られる場所という雰囲気です。

以前の質問回答で、そういう要望にチャレンジしてみたものがあり、参考になると思います。
https://teratail.com/questions/296228#reply-420312
websocketの通信処理をうまくクラス内に隠蔽し、メッセージだけをmain関数側で処理できるようにしています。ややasync/awaitの記述がうるさいのはご容赦ください。このコードをベースにすると、質問者が書きたいコードが書きやすいように思います。

なお、websocketsという紛らわしい名前のライブラリがあり、そちらを使っていますのでご注意ください。

投稿2020/11/15 14:29

toast-uz

総合スコア3266

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

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

taro_yamada

2020/11/16 15:17

asyncioについては、何度かチャレンジしているのですが、平日昼間のみのPUSHデータのみを扱っているので、テストができず、学習が進まずにいます。 時期を見てしっかり勉強したいと思います。 とりあえず、今回の問題は、thread処理とglobal変数(モジュール内変数)でなんとか乗り切ってみようと思っています。 いつもご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問