web-dev-qa-db-de.com

Wie vermeide ich einen Rohrbruch bei errno 32?

Derzeit verwende ich eine in Python integrierte App. Wenn ich es auf einem PC laufen lasse, funktioniert es ohne Probleme.

Wenn ich es jedoch auf einen Produktionsserver verschiebe. Es zeigt mir den Fehler wie folgt an:.

Ich habe einige Nachforschungen angestellt und festgestellt, dass der Browser des Endbenutzers die Verbindung beendet, während der Server noch Daten sendet.

Ich frage mich, warum es passiert ist und was die Hauptursache ist, die verhindert, dass es auf dem Produktionsserver ordnungsgemäß ausgeführt wird, während es auf meinem PC funktioniert. Jeder Rat wird geschätzt

    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
109
SƲmmēr Aƥ

Ihr Serverprozess hat ein SIGPIPE empfangen, das an einen Socket geschrieben wurde. Dies geschieht normalerweise, wenn Sie in einen Socket schreiben, der auf der anderen (Client-) Seite vollständig geschlossen ist. Dies kann vorkommen, wenn ein Client-Programm nicht auf den Empfang aller Daten vom Server wartet und einfach einen Socket schließt (mithilfe der Funktion close).

In einem C-Programm würden Sie normalerweise versuchen, das SIGPIPE -Signal zu ignorieren oder einen Dummy-Signal-Handler dafür zu setzen. In diesem Fall wird beim Schreiben in einen geschlossenen Socket ein einfacher Fehler zurückgegeben. In Ihrem Fall scheint ein python eine Ausnahme auszulösen, die als vorzeitige Trennung des Clients behandelt werden kann.

77

Dies hängt davon ab, wie Sie es getestet haben, und möglicherweise von Unterschieden in der Stapelimplementierung von TCP) des PCs und des Servers.

Wenn beispielsweise Ihr sendall auf dem PC immer sofort (oder sehr schnell) ausgeführt wird, ist die Verbindung beim Senden möglicherweise nie unterbrochen worden. Dies ist sehr wahrscheinlich, wenn Ihr Browser auf demselben Computer ausgeführt wird (da keine echte Netzwerklatenz besteht).


Im Allgemeinen müssen Sie nur den Fall behandeln, in dem ein Client die Verbindung trennt, bevor Sie fertig sind, indem Sie die Ausnahme behandeln.

Denken Sie daran, dass TCP die Kommunikation asynchron ist, dies ist jedoch bei physisch entfernten Verbindungen viel offensichtlicher als bei lokalen. Daher kann es schwierig sein, solche Bedingungen auf einer lokalen Workstation zu reproduzieren eine einzelne Maschine ist oft fast synchron.

8
Useless

Der Pipe-Fehler tritt normalerweise auf, wenn Ihre Anforderung blockiert ist oder zu lange dauert. Nach einer Zeitüberschreitung auf der Anforderungsseite wird die Verbindung geschlossen. Wenn die Antwortseite (der Server) versucht, auf den Socket zu schreiben, wird ein ausgelöst Rohrbruchfehler.

6
Aaren Shar

Dies kann daran liegen, dass Sie beim Einfügen von Daten in die Datenbank zwei Methoden verwenden und die Website dadurch langsamer wird.

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('/')

In der obigen Funktion ist der Fehler, wohin der Pfeil zeigt. Die korrekte Implementierung ist unten:

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('/')
3