2013-05-22 4 views
6

파이썬 프로그램은 http 요청을하기 위해 httplib2.Http를 사용합니다. 일단 요청을 생성해야한다면 httplib2.Http 객체를 만들어 내 프로그램이 자주 httplib2.Http 객체를 생성/파괴 할 수 있도록합니다.이것은 httplib2의 버그입니까

내 프로그램이 열려있는 파일의 최대 개수에 도달하기 때문에 쉽게 충돌하는 것으로 나타났습니다./proc/fd를 검사하면 오픈 소켓 fds가 너무 많습니다. 이 문제로 인해 httplib2 소스 코드를 파헤쳐 야했습니다.

 else: 
      content = "" 
      if method == "HEAD": 
       conn.close() 
      else: 
       content = response.read() 
      response = Response(response) 
      if method != "HEAD": 
       content = _decompressContent(response, content) 
     break 

이것은 HTTP 메소드가 HEAD 인 경우 폐쇄 전용 그 소켓을 보여줍니다

은 그 때 나는 httplib2.Http._conn_request 방법으로, 같은 코드가 있었다 것을 발견했다. 아마 httplib2가 어떻게 든 소켓을 재사용하고 싶어했을 것입니다. 하지만 Http 클래스에는 close() 메서드가 없습니다. 즉, Http 요청을하면 소켓은 프로세스가 종료 될 때까지 닫히지 않습니다. 내 프로그램이 잘 작동, 그 후

 else: 
      content = "" 
      if method == "HEAD": 
       conn.close() 
      else: 
       content = response.read() 
      response = Response(response) 
      if method != "HEAD": 
       content = _decompressContent(response, content) 
       conn.close() # I ADD THIS CLOSE 
     break 

:

은 그 때 나는 코드를 수정했습니다.

그러나 httplib2가 매우 오래되고 공통된 lib라는 점을 감안할 때 여전히 httplib2의 버그 인 경우 궁금합니다.

답변

6

아니요, 연결이 닫히지 않는다는 사실은 버그가 아니므로 다음 요청을 위해 연결을 다시 사용해야합니다.

방법으로 이 쓰여지면 서버가 연결을 닫거나 시간이 초과 될 때까지 기다리지 만 오류가있는 경우를 제외하고는 닫지 않습니다. 연결이 닫힌 경우 은 다음 번에 다시 연결하려고 시도합니다.

연결을 닫으면 (소스에 대한 패치와 마찬가지로) 불가능합니다. 모든 요청은 자체 연결을 사용해야합니다.

개체를 삭제하면 열린 연결이 connections 사전에서만 참조되는 것처럼 자동으로 닫히므로 작성한 Http 개체에 대한 참조를 유지하지 않으면 작동합니다. 참조가 필요하지 않으셨습니까?

은 또한 당신은 당신의 요청에 Connnection: close 헤더를 전달할 수 :

http.request("http://example.org", headers={'Connection': 'close'}) 

각 요청 후 연결을 닫습니다 서버의 원인이해야한다고. 또는 개체의 connections dict에있는 모든 연결을 수동으로 닫으려고 할 수 있습니다.