programing

Erno 32 파이프가 부러지는 것을 어떻게 예방합니까?

i4 2023. 6. 20. 21:22
반응형

Erno 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함수)를 선택합니다.

에서는 보통 를 무시하도록 합니다.SIGPIPE신호를 보내거나 더미 신호 핸들러를 설정합니다.이 경우 닫힌 소켓에 쓸 때 간단한 오류가 반환됩니다.이 경우 Python은 클라이언트의 조기 연결 해제로 처리할 수 있는 예외를 던지는 것 같습니다.

파이프 끊김 오류는 일반적으로 요청이 차단되거나 시간이 너무 오래 걸리는 경우 발생하며 요청 측 시간 초과 후 연결이 닫히고 응답 측(서버)이 소켓에 쓰려고 하면 파이프 중단 오류가 발생합니다.

테스트 방법에 따라 다르며, 개인 컴퓨터와 서버의 TCP 스택 구현 차이에 따라 다를 수 있습니다.

를 들어, 당신의 를들어당이, ▁your이.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('/')

프로그램 맨 위에 있는 이 코드를 사용해 보십시오.

from signal import signal, SIGPIPE, SIG_DFL
signal(SIGPIPE,SIG_DFL)

그것은 문제를 해결할 것입니다.

웹 애플리케이션이나 서비스(예: Flask 또는 FastAPI)가 파이썬인 경우 운영 서버가 너무 오래 걸리는 요청 시간을 초과하도록 구성된 경우 이 오류가 발생할 수 있습니다.Gunicorn 및 Uvicorn에는 GRACE_TIMEOUT 및 TIME과 같은 관련 매개 변수가 있으며, 애플리케이션의 필요에 따라 구성해야 합니다.역방향 프록시 또는 게이트웨이 시간 초과 임계값을 확인할 수도 있습니다.

언급URL : https://stackoverflow.com/questions/11866792/how-to-prevent-errno-32-broken-pipe

반응형