web-dev-qa-db-fra.com

Comment prévenir errno 32 tuyau cassé?

Actuellement, j'utilise une application construite en python. Lorsque je l'exécute sur un ordinateur personnel, cela fonctionne sans problème.

Cependant, lorsque je le déplace dans un serveur de production. Il continue à me montrer l'erreur jointe comme ci-dessous:.

J'ai effectué des recherches et j'ai eu la raison pour laquelle le navigateur de l'utilisateur final arrête la connexion pendant que le serveur est toujours en train d'envoyer des données.

Je me demande pourquoi cela s'est produit et quelle est la cause fondamentale qui l'empêche de fonctionner correctement sur le serveur de production, alors que cela fonctionne sur mon ordinateur personnel. Tout conseil est apprécié

    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ƥ

Votre processus serveur a reçu une écriture SIGPIPE sur un socket. Cela se produit généralement lorsque vous écrivez sur un socket complètement fermé de l'autre côté (client). Cela peut se produire lorsqu'un programme client n'attend pas que toutes les données du serveur soient reçues et ferme simplement un socket (en utilisant la fonction close).

Dans un programme C, vous devriez normalement essayer de régler pour ignorer le signal SIGPIPE ou pour définir un gestionnaire de signal factice. Dans ce cas, une simple erreur sera renvoyée lors de l'écriture sur un socket fermé. Dans votre cas, un python semble émettre une exception qui peut être gérée comme une déconnexion prématurée du client.

77
Maksim Skurydzin

Cela dépend de la façon dont vous l'avez testé et éventuellement des différences entre l'implémentation de la pile TCP de l'ordinateur personnel et du serveur.

Par exemple, si votre sendall complète toujours immédiatement (ou très rapidement) sur votre ordinateur, la connexion n’aura peut-être jamais été interrompue au cours de l’envoi. Ceci est très probable si votre navigateur est exécuté sur le même ordinateur (car il n’ya pas de latence réseau réelle).


En général, vous devez simplement gérer le cas où un client se déconnecte avant d'avoir terminé, en gérant l'exception.

N'oubliez pas que les communications TCP sont asynchrones, mais ceci est beaucoup plus évident sur les connexions physiquement distantes que sur les connexions locales. Il est donc difficile de reproduire de telles conditions sur un poste de travail local. Plus précisément, les connexions en boucle sur une seule machine sont souvent presque synchrones.

8
Useless

L'erreur de canal interrompu se produit généralement si votre demande est bloquée ou prend trop de temps et qu'après l'expiration du délai de requête, la connexion sera fermée, puis, lorsque le côté de la réponse (serveur) essaiera d'écrire dans le socket, erreur de tuyau cassé.

6
Aaren Shar

Cela peut être dû au fait que vous utilisez deux méthodes pour insérer des données dans une base de données, ce qui ralentit le site.

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

Dans la fonction ci-dessus, l'erreur correspond à l'emplacement de la flèche. La mise en œuvre correcte est ci-dessous:

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
Kuldeep K. Rishi