В настоящее время я использую приложение, построенное на 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
python
broken-pipe
SƲmmēr A
источник
источник
Ответы:
Ваш серверный процесс получил
SIGPIPE
запись в сокет. Обычно это происходит, когда вы пишете в полностью закрытый сокет на другой (клиентской) стороне. Это может происходить, когда клиентская программа не дожидается получения всех данных с сервера и просто закрывает сокет (используяclose
функцию).В программе на C вы обычно пытаетесь настроить игнорирование
SIGPIPE
сигнала или установить для него фиктивный обработчик сигнала. В этом случае при записи в закрытый сокет будет возвращена простая ошибка. В вашем случае кажется, что питон генерирует исключение, которое может быть обработано как преждевременное отключение клиента.источник
Это зависит от того, как вы его тестировали, и, возможно, от различий в реализации стека TCP на персональном компьютере и сервере.
Например, если вы
sendall
всегда завершаете работу сразу (или очень быстро) на персональном компьютере, соединение может просто никогда не прерываться во время отправки. Это очень вероятно, если ваш браузер работает на том же компьютере (поскольку реальной сетевой задержки нет).В общем, вам просто нужно обработать случай, когда клиент отключается до того, как вы закончите, путем обработки исключения.
Помните, что TCP-связь является асинхронной, но это гораздо более очевидно для физически удаленных подключений, чем для локальных, поэтому такие условия может быть трудно воспроизвести на локальной рабочей станции. В частности, петлевые соединения на одной машине часто почти синхронны.
источник
try ... except
Ошибка сломанной трубы обычно возникает, если ваш запрос заблокирован или занимает слишком много времени и после тайм-аута на стороне запроса он закрывает соединение, а затем, когда сторона ответа (сервер) пытается записать в сокет, он выдаст сообщение ошибка обрыва трубы.
источник
Это может быть связано с тем, что вы используете два метода для вставки данных в базу данных, и это замедляет работу сайта.
В приведенной выше функции ошибка заключается в том, где указывает стрелка. Правильная реализация ниже:
источник