回答編集履歴

4

typo修正 run_server -> run_forever

2022/10/18 13:54

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -37,7 +37,7 @@
37
37
  def main() -> None:
38
38
  """
39
39
  この利用では変数 count は数値型なので問題ありませんが、
40
- この利用例 (run_server(threaded=True)) では new_client 関数は別スレッドで呼ばれる為、
40
+ この利用例 (run_forever(threaded=True)) では new_client 関数は別スレッドで呼ばれる為、
41
41
  複数スレッドから参照されるオブジェクトを扱う際は、排他制御を独自に行う必要があります。
42
42
 
43
43
  websocket サーバに対する複数スレッドからの同時メッセージ送信については

3

補足説明を追加

2022/10/18 13:52

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -36,7 +36,12 @@
36
36
 
37
37
  def main() -> None:
38
38
  """
39
+ この利用では変数 count は数値型なので問題ありませんが、
40
+ この利用例 (run_server(threaded=True)) では new_client 関数は別スレッドで呼ばれる為、
41
+ 複数スレッドから参照されるオブジェクトを扱う際は、排他制御を独自に行う必要があります。
39
42
 
43
+ websocket サーバに対する複数スレッドからの同時メッセージ送信については
44
+ websocket_server ライブラリが最新であれば問題ありません。過去バージョンではマルチスレッドに未対応。
40
45
  """
41
46
  count = 0
42
47
 

2

サンプルコードを追加

2022/10/18 13:42

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -26,3 +26,35 @@
26
26
  asyncio を用いた他の websocket ライブラリでは
27
27
  接続時に呼び出されるハンドラ内に、ループ処理で非同期に実行されるコードを書けます。
28
28
 
29
+
30
+ ----
31
+ サーバーを別スレッドで実行するコードのサンプルを追記
32
+ ```python
33
+
34
+ import time
35
+ from websocket_server import WebsocketServer
36
+
37
+ def main() -> None:
38
+ """
39
+
40
+ """
41
+ count = 0
42
+
43
+ def new_client(client, server):
44
+ # 新規接続時にリセット
45
+ nonlocal count
46
+ count = 0
47
+
48
+ server = WebsocketServer(port=9999)
49
+ server.set_fn_new_client(new_client)
50
+ server.run_forever(threaded=True)
51
+
52
+ while True:
53
+ count += 1
54
+ server.send_message_to_all(f"{count}")
55
+ time.sleep(1)
56
+
57
+ if __name__ == '__main__':
58
+ main()
59
+ ```
60
+

1

他のライブラリについて補足

2022/10/18 12:17

投稿

teamikl
teamikl

スコア8664

test CHANGED
@@ -22,3 +22,7 @@
22
22
  JavaScript 側の setInterval で、毎秒 websocker server へ何かのメッセージを投げかけて
23
23
  そのメッセージに対する返信 message_recieved ハンドラ内でカウント数を送出するようにする、等。
24
24
 
25
+ 他の実装案2:
26
+ asyncio を用いた他の websocket ライブラリでは
27
+ 接続時に呼び出されるハンドラ内に、ループ処理で非同期に実行されるコードを書けます。
28
+