1. ホーム
  2. python

[解決済み】 errno 32 壊れたパイプを防ぐには?

2022-01-28 23:47:41

質問内容

現在、pythonで作られたアプリを使用しています。パソコンで実行すると、問題なく動作しています。

しかし、本番サーバーに移したとき。以下のようなエラーが表示され続けています。

いろいろ調べてみたところ、サーバーがデータ送信に追われている間に、エンドユーザーのブラウザが接続を停止してしまうことが原因でした。

なぜこのようなことが起こったのか、また、私のパソコンでは動作するのに、本番サーバーでは正常に動作しない根本的な原因は何なのか、疑問に思っています。何かアドバイスがあればお願いします。

    Exception happened during processing of request from ('127.0.0.1', 34226)
Traceback (most recent call last):
  File "/usr/lib/python2.7/SocketServer.py", line 284, in
_handle_request_noblock
    self.process_request(request, client_address)
  File "/usr/lib/python2.7/SocketServer.py", line 310, in process_request
    self.finish_request(request, client_address)
  File "/usr/lib/python2.7/SocketServer.py", line 323, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/lib/python2.7/SocketServer.py", line 641, in __init__
    self.finish()
  File "/usr/lib/python2.7/SocketServer.py", line 694, in finish
    self.wfile.flush()
  File "/usr/lib/python2.7/socket.py", line 303, in flush
    self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 32] Broken pipe

解決方法は?

あなたのサーバー・プロセスは SIGPIPE ソケットに書き込んだ。これは通常、相手側(クライアント)で完全に閉じたソケットに書き込んだときに起こります。これは、クライアントプログラムがサーバからのデータをすべて受信するまで待たず、単にソケットをクローズした場合( close 関数)を使用します。

C言語プログラムでは、通常は SIGPIPE シグナルに対応するダミーのシグナルハンドラを設定します。この場合、閉じたソケットに書き込むと、単純なエラーが返されます。あなたの場合、pythonはクライアントの早すぎる切断として処理できる例外を投げるようです。