errno 32 파손 파이프를 방지하는 방법?
현재 파이썬으로 작성된 앱을 사용하고 있습니다. 개인용 컴퓨터에서 실행할 때 문제없이 작동합니다.
그러나 프로덕션 서버로 옮길 때. 아래와 같이 첨부 된 오류가 계속 표시됩니다.
나는 약간의 연구를 해왔으며 서버가 여전히 데이터를 전송하는 동안 최종 사용자 브라우저가 연결을 중지하는 이유가 있습니다.
개인용 컴퓨터에서 작동하는 동안 왜 이런 일이 발생했으며 프로덕션 서버에서 제대로 실행되지 못하게하는 근본 원인이 무엇인지 궁금합니다. 모든 조언을 부탁드립니다
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
서버 프로세스가 SIGPIPE
소켓에 대한 쓰기를 수신했습니다 . 이것은 일반적으로 다른 쪽 (클라이언트)에서 완전히 닫힌 소켓에 쓸 때 발생합니다. 이것은 클라이언트 프로그램이 서버의 모든 데이터가 수신 될 때까지 기다리지 않고 단순히 소켓을 닫을 때 발생합니다 ( close
함수 사용 ).
C 프로그램에서는 일반적으로 SIGPIPE
신호 를 무시 하거나 더미 신호 처리기를 설정하도록 설정합니다. 이 경우 닫힌 소켓에 쓸 때 간단한 오류가 반환됩니다. 귀하의 경우 파이썬은 클라이언트의 조기 연결 해제로 처리 할 수있는 예외를 throw하는 것 같습니다.
테스트 방법 및 개인용 컴퓨터와 서버의 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('/')
참고 URL : https://stackoverflow.com/questions/11866792/how-to-prevent-errno-32-broken-pipe
'program story' 카테고리의 다른 글
RSS 피드에서 모든 오래된 항목을 가져 오려면 어떻게합니까? (0) | 2020.07.29 |
---|---|
Linux cron 작업을 "Amazon 방식"으로 변환하는 방법은 무엇입니까? (0) | 2020.07.29 |
Core Animation으로 사용자 정의 여유 기능을 만드는 방법은 무엇입니까? (0) | 2020.07.29 |
OpenSSL 및 openssl.conf 파일 읽기 오류 (0) | 2020.07.28 |
원격 추적 분기에서 'git fetch'및 'git merge'를 어떻게 수행합니까 (예 : 'git pull') (0) | 2020.07.28 |