Как предотвратить errno 32 сломанную трубу?


В настоящее время я использую приложение, встроенное в 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
4 95

4 ответа:

ваш серверный процесс получает SIGPIPE запись в сокет. Это обычно происходит, когда вы пишете в сокет, полностью закрытый на другой (клиентской) стороне. Это может происходить, когда клиентская программа не дожидается получения всех данных с сервера и просто закрывает сокет (используя

Это зависит от того, как вы его тестировали, и, возможно, от различий в реализации стека TCP персонального компьютера и сервера.

например, если ваш sendall всегда завершает немедленно (или очень быстро) на персональном компьютере, соединение может просто никогда не ломались во время отправки. Это очень вероятно, если Ваш браузер работает на той же машине (так как нет реальной задержки в сети).


В общем, вам просто нужно обрабатывать случай, когда клиент отключается до того, как вы закончите, обработав исключение.

помните, что TCP-соединения являются асинхронными, но это гораздо более очевидно для физически удаленных соединений, чем для локальных, поэтому такие условия могут быть трудно воспроизвести на локальной рабочей станции. В частности, петлевые соединения на одной машине часто почти синхронно.

это может быть связано с тем, что вы используете два метода для вставки данных в базу данных, и это приводит к замедлению работы сайта.

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

ошибка сломанной трубы обычно возникает, если ваш запрос заблокирован или занимает слишком много времени, и после тайм-аута на стороне запроса он закроет соединение, а затем, когда ответная сторона (сервер) попытается записать в сокет, он выдаст ошибку сломанной трубы.