errno 32パイプの破損を防ぐ方法は?


120

現在、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

これはあなたの問題「を解決しますか」?
Pureferret

またはuwsgiなどと接続する
キョンフンキム

回答:


85

サーバープロセスがSIGPIPEソケットへの書き込みを受信しました。これは通常、反対側(クライアント)側で完全に閉じたソケットに書き込むときに発生します。これは、クライアントプログラムがサーバーからのすべてのデータを受信するまで待機せず、単に(close関数を使用して)ソケットを閉じるときに発生する可能性があります。

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


2
ここでは、クライアントが接続を切断取り扱いに関する良い答えです:stackoverflow.com/a/180922/276274は
マクシムSkurydzin

9

これは、テスト方法、および場合によっては、パーソナルコンピューターとサーバーのTCPスタック実装の違いに依存します。

たとえばsendall、パーソナルコンピュータで常に即時に(または非常に迅速に)完了する場合、送信中に接続が切断されることはありません。これは、ブラウザーが同じマシンで実行されている場合に非常によく起こります(実際のネットワーク遅延はないため)。


一般に、例外を処理することで、クライアントが終了する前に切断する場合に対処する必要があります。

TCP通信は非同期であることを覚えておいてください。ただし、これはローカル接続よりも物理的にリモート接続の方がはるかに明白であるため、このような条件をローカルワークステーションで再現するのは難しい場合があります。具体的には、単一のマシン上のループバック接続は、ほとんどの場合ほぼ同期しています。


「paster serve abc.ini --reload」を実行してテストしていますが、ウェブページにアクセスできませんでした。VMWare Workstationでは、ネットワーク接続にホストのみのオプションを使用しています。それで、それを適切に実行する方法を教えてください。
SƲmmērAƥ

1
それは別のVMWareネットワーク構成の質問だと思います(私はそれについて何も知りません)。その理由のワークステーションとサーバーが異なる動作をすることは、しかし上記で、解決策はただで例外を処理することであるtry ... except
ダメ

7

壊れたパイプのエラーは通常、リクエストがブロックされるか時間がかかりすぎる場合に発生し、リクエスト側のタイムアウト後に接続を閉じ、応答側(サーバー)がソケットに書き込もうとすると、パイプ破損エラー。


3

これは、データベースにデータを挿入するために2つの方法を使用していて、サイトの速度が低下することが原因である可能性があります。

def add_subscriber(request, email=None):
    if request.method == 'POST':
        email = request.POST['email_field']
        e = Subscriber.objects.create(email=email).save()  <==== 
        return HttpResponseRedirect('/')
    else:
        return HttpResponseRedirect('/')

上記の関数では、エラーは矢印が指しているところです。正しい実装は以下のとおりです。

def add_subscriber(request, email=None):
    if request.method == 'POST':
        email = request.POST['email_field']
        e = Subscriber.objects.create(email=email)
        return HttpResponseRedirect('/')
    else:
        return HttpResponseRedirect('/')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.