1. ホーム
  2. Python

python マルチスレッド操作エラー。logger "websocket "のハンドラが見つかりませんでした。

2022-02-12 07:30:58

pythonを使ってトランシーバーオンラインツールのシミュレーションをしたところ、サーバーの最大接続成功数が1020接続となり、このボトルネックの原因を突き止めなければなりません
1. 接続に失敗したときに報告されるエラーメッセージは
logger "websocket"のハンドラが見つかりませんでした。
回避策
インポートロギング
logging.basicConfig()
2. 上記問題を修正した後に得られた具体的なエラーメッセージは以下の通りです。
ERROR:websocket:error from callback <bound method pressure_webSocket.on_error of <lib.protocol.pressure_webSocket instance at 0x7f9b4415a248>>: cannot concatenate 'str' and 'exceptions.ValueError' objects
解決方法 ウェブソケットのコールバック処理関数内のエラーデータを文字列に変換してから接続するようにしていない。
def on_error(self,ws,error):
    log.error(エラー)
として、修正に従います。
def on_error(self,ws,error):
    log.error(str(error))

3. ウェブソケットコールバックに例外データの処理の修正を追加した後、プログラムは以下のエラーメッセージを報告します。
Error# filedescriptor out of range in select()
エラーの原因 python socketモジュールがselectモジュールのソースコードを呼び出し、selectコールを実行した際に1024より大きなfdが渡され、上記エラーとなる。
4. ショートリンクを多用するため、1プロセス内のfd数が1024の制限を超えて増加し、冒頭のような例外が発生する。
回避策
(1) この値はカーネルで定義されているため、現在の解決策を維持したままこの問題を解決するには、この値を増やすためにLinux-kernelを再コンパイルする必要があります。
(2) stpclientのクライアント側で、fdの数が少なく、性能に問題がなく、他のプラットフォームでもselectがサポートされていたため、古いselectの代わりにepollを使用するように修正すること。