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

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

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

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

WebSocket

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

Python

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

Q&A

解決済

1回答

2731閲覧

python 3.7 websocket使用時におけるマルチプロセス処理のエラー

wiz_planet

総合スコア13

Python 3.x

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

WebSocket

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

Python

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

0グッド

0クリップ

投稿2019/05/12 09:16

編集2019/05/12 12:48

websocketを使用しながらマルチプロセスでサブプロセスを動作させておきメモリ空間を共有させたいと思っているのですが、サブプロセスのルーチンが早々に停止してしまいます。
マルチプロセスだけなら走るのですがwebsocketを組み合わせるとうまく動かず困っています。

エラーメッセージ

該当のソースコード

python

1# websocket 2class WebsocketAPI(object): 3 def __init__(): 4 5 def run(): 6 7 def on_message(): 8 9 def on_close(): 10 11 def on_open(): 12 13# サブプロセス 14def test_func(d): 15 print("in test_func started") 16 d[1] = 200 17 print(d[1]) 18 d["test"] = "test1" 19 print(d["test"]) 20 while True: 21 print(d) 22 sleep(0.5) 23 24 25if __name__ == '__main__': 26 27 while True: 28 try: 29 with Manager() as manager: 30 d = manager.dict() 31 test_process = Process(target=test_func, args=(d)) 32 print("start") 33 test_process.start() 34 print("finished") 35 break 36 except ccxt.BaseError as e: 37 print(" error in SubProcess : test_func()",e) 38 print("recall") 39 sleep(1) 40 41 #API endpoint 42 url, channel, json_rpc = make_connection() 43 #ctrl + cで終了 44 while True: 45 try: 46 json_rpc.run() 47 break 48 except ccxt.BaseError as e: 49 print(" error in _MAIN_ json_rpc.run()", e) 50 url, channel, json_rpc = make_connection() 51

発生している問題・エラーメッセージ

(base) C:\test>python websocket.py start finished called _init_ websocket.WebSocketApp open 正常終了 json_rpc : <__main__.RealtimeAPI object at 0x0000023E460B6D68> --- request header --- ----------------------- --- response header --- ----------------------- called on_open connected streaming server send: b'\x81\xd1\x8b\xd1t\xbf\xf0\xf3\x19\xda\xff\xb9\x1b\xdb\xa9\xebT\x9d\xf8\xa4\x16\xcc\xe8\xa3\x1d\xdd\xee\xf3X\x9f\xa9\xa1\x15\xcd\xea\xbc\x07\x9d\xb1\xf1\x0f\x9d\xe8\xb9\x15\xd1\xe5\xb4\x18\x9d\xb1\xf1V\xd3\xe2\xb6\x1c\xcb\xe5\xb8\x1a\xd8\xd4\xb4\x0c\xda\xe8\xa4\x00\xd6\xe4\xbf\x07\xe0\xcd\x89+\xfd\xdf\x92+\xf5\xdb\x88V\xc2\xf6' ~~~~~~~~~~~~ ~~ websocket 処理~~ ~~~~~~~~~~~~ ~~~~~~~~~~~サブプロセスエラー~~~~~~~~~~~~~~~~ Process Process-2: Traceback (most recent call last): File "C:\Anaconda3_2\lib\multiprocessing\process.py", line 297, in _bootstrap self.run() File "C:\Anaconda3_2\lib\multiprocessing\process.py", line 99, in run self._target(*self._args, **self._kwargs) TypeError: test_func() missing 1 required positional argument: 'd' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~ ~~ websocket 処理~~ ~~~~~~~~~~~~

サブプロセスについては最初のプリント文すら表示されません。
何が原因かわかれば教えてください。よろしくお願いします。

追記

初期エラーが改善され、次のエラーが生じたため編集コードとエラーを抜粋して追記します。 またサブプロセス1行目のプリント文までは出力されるようになりました。 引き続きよろしくお願いします。

発生している問題・エラーメッセージ2

~~~~~~~~~~~サブプロセスエラー~~~~~~~~~~~~~~~~ in test_func started Process Process-2: Traceback (most recent call last): File "C:\Anaconda3_2\lib\multiprocessing\managers.py", line 788, in _callmethod conn = self._tls.connection AttributeError: 'ForkAwareLocal' object has no attribute 'connection' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "C:\Anaconda3_2\lib\multiprocessing\process.py", line 297, in _bootstrap self.run() File "C:\Anaconda3_2\lib\multiprocessing\process.py", line 99, in run self._target(*self._args, **self._kwargs) File "C:\test\websocket.py", line 563, in test_func d[1] = 200 File "<string>", line 2, in __setitem__ File "C:\Anaconda3_2\lib\multiprocessing\managers.py", line 792, in _callmethod self._connect() File "C:\Anaconda3_2\lib\multiprocessing\managers.py", line 779, in _connect conn = self._Client(self._token.address, authkey=self._authkey) File "C:\Anaconda3_2\lib\multiprocessing\connection.py", line 490, in Client c = PipeClient(address) File "C:\Anaconda3_2\lib\multiprocessing\connection.py", line 691, in PipeClient _winapi.WaitNamedPipe(address, 1000) FileNotFoundError: [WinError 2] 指定されたファイルが見つかりません。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

該当のソースコード

python

1# サブプロセス 2# 変数を2つに修正 3def test_func(d,l): 4 print("in test_func") 5 d[1] = 200 6 print(d[1]) 7 d["test"] = "test1" 8 print(d["test"]) 9 while True: 10 print(d) 11 print(l) 12 sleep(0.5) 13 14if __name__ == '__main__': 15 16 while True: 17 try: 18 with Manager() as manager: 19 d = manager.dict() 20 ### 変数 l を追加 ### 21 l = manager.list(range(5)) 22 test_process = Process(target=test_func, args=(d,l)) 23 print("start") 24 test_process.start() 25 print("finished") 26 break 27 except ccxt.BaseError as e: 28 print(" error in SubProcess : test_func()",e) 29 print("recall") 30 sleep(1) 31 32 #API endpoint 33 url, channel, json_rpc = make_connection() 34 #ctrl + cで終了 35 while True: 36 try: 37 json_rpc.run() 38 break 39 except ccxt.BaseError as e: 40 print(" error in _MAIN_ json_rpc.run()", e) 41 url, channel, json_rpc = make_connection() 42

追記2

※抜けていたプログラムコードを追記します。

該当のソースコード2

python

1# API 接続 2def make_connection(): 3 #API endpoint 4 url = 'URL' 5 channel = '希望するAPI情報の種類(str)' 6 json_rpc = WebsocketAPI(url=url, channel=channel) 7 print("json_rpc : ", json_rpc) 8 return url, channel, json_rpc 9

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

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

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

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

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

guest

回答1

0

ベストアンサー

python

1 test_process = Process(target=test_func, args=(d))

python

1 test_process = Process(target=test_func, args=(d,))

にしないとtupleとみなされません。

他にもまずいことがあるかもしれませんが、ぱっと見て気づいた点だけ。


以下解決方法の要約。詳細はコメント欄参照。

AttributeError: 'ForkAwareLocal' object has no attribute 'connection'の直接の原因は、Managerのインスタンス生成をwith文で行っており、ブロックを抜けたあとにも使用しようとしていたため。withのブロックを抜けるときに閉じられてしまうので、その後にManagerの機能を使おうとしてもエラーになる。

投稿2019/05/12 10:27

編集2019/05/12 13:05
hayataka2049

総合スコア30933

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

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

wiz_planet

2019/05/12 11:33

ありがとうございます。 リストを追加して変数を二つにして対応してみました。
wiz_planet

2019/05/12 11:33

そして先ほどのエラーは解消され次は別のエラーが出ました。。
hayataka2049

2019/05/12 11:35

修正後のコードとエラーを質問文に追記してみてください。
wiz_planet

2019/05/12 11:46

追記してみました。。 ファイルを指定した覚えもありませんし、このエラーがどういうことなのかよくわかりませんでした。
hayataka2049

2019/05/12 11:52

前の内容は残した上で「追記」にしてください。どういう流れなのかわけわからなくなるので。
wiz_planet

2019/05/12 12:20

すみません、内容を修正しました。。
wiz_planet

2019/05/12 12:22

メインが死ぬとはどういうことでしょうか? websocketのことでしょうか?
wiz_planet

2019/05/12 12:28

メインはjson_rpc.run()で回り続けているんじゃないでしょうか? サブはループで回し続けるのでjoinで待つと json_rpc.run()までたどり着けなくなります。
wiz_planet

2019/05/12 12:29

while True: try: with Manager() as manager: d = manager.dict() l = manager.list(range(5)) test_process = Process(target=test_func, args=(d,l)) print("start") test_process.start() test_process.join() print("finished") break
hayataka2049

2019/05/12 12:30

>メインはjson_rpc.run()で回り続けているんじゃないでしょうか? と言われても、私にこれらが何者なのかわかる情報は与えられていませんので・・・
wiz_planet

2019/05/12 12:31

上記の箇所にjoinを挿入してみたらサブは問題なく回りました。 これをメインと同時にやりたいです。。
hayataka2049

2019/05/12 12:32

下のwhileを抜けたところでjoinしてみては?
wiz_planet

2019/05/12 12:34

すみません、情報不足でしたね。。 json_rpc.run()を回し続けつつ、サブも回し続けたいです。 今はサブが回り続けるようになりました。
wiz_planet

2019/05/12 12:36

このプログラムでは下のwhileは抜けない仕様になっています。 このwhileのjson_rpc.run()で取得し続けるAPI情報を加工したデータをプリントし続けるプログラムとなっています。
hayataka2049

2019/05/12 12:37

・make_connectionという関数の仕様 ・変数json_rpcとして受け取っている返り値のクラスの仕様 の2点は示していただけませんか? それがないと適切に助言することは難しいです。
wiz_planet

2019/05/12 12:40

だいぶ端折って書いたので抜けてるところがあるのですが、 json_rpc.run()はclass WebsocketAPI(object)のon_message()関数を実行し続ける仕組みになってます。
wiz_planet

2019/05/12 12:40

追記しますのでちょっと待ってください。
wiz_planet

2019/05/12 12:49

make_connection()追記しておきました。
hayataka2049

2019/05/12 12:51

了解です。要するにWebsocketAPIのインスタンスを返すだけということですね。
wiz_planet

2019/05/12 12:51

APIの返り値のクラスは list になります。
hayataka2049

2019/05/12 12:53 編集

はい、url, channel, json_rpcを返すということですね。 見落としていたのですが(すみません)、withでManagerを作るとwithを抜けた瞬間にクローズされますので、こちらが原因かもしれません。使わない方法で書き直してみてください(manager = Manager()に置き換え)
wiz_planet

2019/05/12 12:55

そのようだと思います。 ただwebsocketは受け取り方がややこしいため、まだあまり深く理解はできていないところです。。
wiz_planet

2019/05/12 12:57

いけました!! いやはや、お付き合いいただき本当にありがとうございます。
wiz_planet

2019/05/12 12:59

このような書き方があることすら知りませんでした。。 withだとクローズされるんですね。 助かりました。ありがとうございます。
hayataka2049

2019/05/12 13:03 編集

「開始処理と終了処理が必要なリソースなどを特定のブロック内でだけ扱う」のがwith文の機能ですね。抜けたあとはもう使い物にならない訳です。 https://www.python-izm.com/advanced/with/ # 違うこと疑ってたせいもあるけど気づくのに時間がかかったし、ちょっと体調が悪いですね。遅くなってすみませんでした。
wiz_planet

2019/05/12 13:12

いえ、こんなに一発で解決できるとは全く思っておりませんでしたので自分でも驚きました! リンクまで貼っていただきありがとうございます。 またコツコツやって行こうと思います。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問