program story

errno 32 파손 파이프를 방지하는 방법?

inputbox 2020. 7. 29. 08:10
반응형

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

반응형