python websockets: https://github.com/aaugustin/websockets/issues/367 でこのgithubの問題と同じ問題が発生しています
提案された解決策は私にとってもうまくいきません。私が得ているエラーは:
websockets.exceptions.ConnectionClosed:WebSocket接続が閉じています:コード= 1006(接続が異常に閉じられました[内部])、理由なし
これは私のコードです:
async def get_order_book(symbol):
with open('test.csv', 'a+') as csvfile:
csvw = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
DT = Data(data=data, last_OB_id=ob_id, last_TR_id=tr_id, sz=10, csvw=csvw)
while True:
if not websocket.open:
print('Reconnecting')
websocket = await websockets.connect(ws_url)
else:
resp = await websocket.recv()
update = ujson.loads(resp)
DT.update_data(update)
async def get_order_books():
r = requests.get(url='https://api.binance.com/api/v1/ticker/24hr')
await asyncio.gather(*[get_order_book(data['symbol']) for data in r.json()])
if __name__ == '__main__':
asyncio.run(get_order_books())
私がテストしてきた方法は、インターネット接続を閉じることですが、10秒の遅延の後も1006エラーが返されます。
私はPython 3.7およびWebsockets 7.0を実行しています。
あなたの考えを教えてください、ありがとう!
だから私は解決策を見つけました:
接続が閉じると、何らかの理由でwhileループから抜け出します。したがって、WebSocketを実行し続けるためには、囲む必要があります。
resp = await websocket.recv()
試して...を除いて持っている
print('Reconnecting')
websocket = await websockets.connect(ws_url)
例外処理部分。
同じ問題が発生しました。しばらく調べたところ、再接続を指示する回答のバージョンが複数見つかりましたが、それが適切なルートだとは思わなかったので、さらに掘り下げました。
デバッグレベルのログを有効にすると、python websocketsはデフォルトでpingパケットを送信し、応答を受信できないため、接続がタイムアウトします。これが標準と一致するかどうかはわかりませんが、最小javascript websocketsはサーバーで完全に問題ありませんmy pythonスクリプトはタイムアウトします。
修正は簡単です:connect
に別のkw引数を追加します:
websockets.connect(uri, ping_interval=None)
同じ引数がサーバー側関数serve
でも機能するはずです。
詳細は https://websockets.readthedocs.io/en/stable/api.html にあります