Hoe kan errno 32 gebroken pijp worden voorkomen?

Momenteel gebruik ik een app die is ingebouwd in Python. Als ik het op een pc start, werkt het zonder problemen.

Als ik het echter naar een productieserver verplaats. Het blijft me de bijgevoegde fout tonen, zoals hieronder:.

Ik heb wat onderzoek gedaan en ik heb de reden gevonden dat de browser van de eindgebruiker de verbinding verbreekt terwijl de server nog bezig is met het verzenden van gegevens.

Ik vraag me af waarom het is gebeurd en wat de hoofdoorzaak is waardoor het niet goed werkt op de productieserver, terwijl het op mijn pc werkt. Elk advies wordt op prijs gesteld

   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

Antwoord 1, autoriteit 100%

Uw serverproces heeft een SIGPIPEontvangen die naar een socket schrijft. Dit gebeurt meestal wanneer u naar een socket schrijft die volledig gesloten is aan de andere (client) kant. Dit kan gebeuren wanneer een clientprogramma niet wacht tot alle gegevens van de server zijn ontvangen en gewoon een socket sluit (met de functie close).

In een C-programma zou je normaal gesproken proberen om het SIGPIPE-signaal in te stellen of er een dummy-signaalhandler voor in te stellen. In dit geval wordt een eenvoudige fout geretourneerd bij het schrijven naar een gesloten socket. In jouw geval lijkt een python een uitzondering te maken die kan worden afgehandeld als een voortijdige ontkoppeling van de client.


Antwoord 2, autoriteit 12%

De gebroken pijpfout treedt meestal op als uw verzoek wordt geblokkeerd of te lang duurt en na een time-out aan de verzoekzijde, wordt de verbinding gesloten en wanneer de antwoordzijde (server) naar de socket probeert te schrijven, wordt zal een pijp gebroken fout gooien.


Antwoord 3, autoriteit 9%

Het hangt af van hoe je het hebt getest en mogelijk van verschillen in de implementatie van de TCP-stack van de pc en de server.

Als uw sendallbijvoorbeeld altijd onmiddellijk (of zeer snel) wordt voltooid op de pc, is de verbinding mogelijk nooit verbroken tijdens het verzenden. Dit is zeer waarschijnlijk als uw browser op dezelfde computer draait (aangezien er geen echte netwerklatentie is).


Over het algemeen hoeft u alleen het geval af te handelen waarbij een client de verbinding verbreekt voordat u klaar bent, door de uitzondering af te handelen.

Onthoud dat TCP-communicatie asynchroon is, maar dit is veel duidelijker bij fysiek externe verbindingen dan bij lokale verbindingen, dus dit soort omstandigheden kunnen moeilijk te reproduceren zijn op een lokaal werkstation. In het bijzonder zijn loopback-verbindingen op een enkele machine vaak bijnasynchroon.


Antwoord 4, autoriteit 3%

Dit kan zijn omdat u twee methoden gebruikt om gegevens in de database in te voegen, waardoor de site trager wordt.

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 bovenstaande functie is de fout waar de pijl wijst. De juiste implementatie staat hieronder:

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

Antwoord 5

Als het een python is, een webtoepassing of -service zoals Flask of FastAPI, kan deze fout optreden als de productieserver is geconfigureerd voor een time-out van een aanvraag die te lang duurt. Er zijn relevante parameters in Gunicorn en Uvicorn zoals GRACEFUL_TIMEOUT en TIMEOUT die moeten worden geconfigureerd volgens de behoeften van uw toepassing. U kunt ook de time-outdrempels van uw reverse proxy of gateway controleren.

Other episodes