Как предотвратить errno 32 сломанной трубы?
В настоящее время я использую приложение, встроенное в python. Когда я запускаю его на персональном компьютере, он работает без проблем.
однако, когда я переместить его на рабочий сервер. Он показывает мне ошибку прикреплен ниже:.
Я провел некоторое исследование, и у меня есть причина, по которой браузер конечного пользователя останавливает соединение, пока сервер все еще занят отправкой данных.
интересно, почему это произошло и что является основной причиной, которая мешает ему работать правильно в production server, пока он работает на моем персональном компьютере. Любые советы приветствуются
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 ответов
ваш серверный процесс получает 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('/')
ошибка сломанной трубы обычно возникает, если ваш запрос заблокирован или занимает слишком много времени, и после тайм-аута на стороне запроса он закроет соединение, а затем, когда сторона ответа (сервер) попытается записать в сокет, он выдаст ошибку сломанной трубы.