2013-03-30 3 views
1

멀티 컬링 요청을 수행 할 때 빈 응답 외에는 아무것도 얻을 수 없습니다. 예외가 발생되지 않지만 응답 값 (아래 코드에서 주석)에 내용pycurl 멀티 컬 요청에서 응답 본문을 얻으려면 어떻게해야합니까?

여기 내 코드의 단순화 된 버전의이 없다 : 나는 컬을 사용하지 않고 동일한 옵션 단일 요청을 한

from StringIO import StringIO 

import pycurl 


class CurlStream(object): 
    curl_count = 0 
    curl_storage = [] 

    def __init__(self): 
     self.curl_multi = pycurl.CurlMulti() 

    def add_request(self, request, post_fields=None): 
     self.curl_count += 1 
     curl = self._create_curl(request, post_fields) 
     self.curl_multi.add_handle(curl) 

    def perform(self): 
     while self.curl_count: 
      while True: 
       response, self.curl_count = self.curl_multi.perform() 
       if response != pycurl.E_CALL_MULTI_PERFORM: 
        break 
      self.curl_multi.select(1.0) 

    def read_all(self): 
     for response in self.curl_storage: 
      print response.getvalue() # this does nothing --prints blank lines 

    def close(self): 
     self.curl_multi.close() 

    def _create_curl(self, request, post_fields): 
     curl = pycurl.Curl() 
     output = StringIO() 
     self.curl_storage.append(output) 
     curl.setopt(curl.URL, request) 
     curl.setopt(curl.WRITEFUNCTION, output.write) 
     curl.setopt(curl.TIMEOUT, 20) 
     return curl 


def main(): 
    curl_stream = CurlStream() 
    curl_stream.add_request('http://www.google.com') 
    curl_stream.add_request('http://www.example.com') 
    curl_stream.perform() 
    curl_stream.read_all() 
    curl_stream.close() 

if __name__ == '__main__': 
    main() 

을 멀티와 그것이 작동합니다.

def _create_curl(self, request, post_fields): 
    curl = pycurl.Curl() 
    curl.setopt(curl.URL, request) 
    curl.setopt(curl.WRITEFUNCTION, self.write_out) 
    curl.setopt(curl.TIMEOUT, 20) 

    # Below is the important bit, I am now adding each curl object to a list 
    self.curl_storage.append(curl) 
    return curl 

def write_out(self, data): 
     print data 
     return len(data) 

multicurl 객체에 컬 오브젝트를 추가 할 때 문제가 있었다, 나는하지 않았다 :

답변

1

좋아, 나는이에 _create_curl 방법 (디버깅을 위해 write_out 추가)를 변경할 때 일 발견 단일 컬 객체에 대한 참조가 유지되어 자동으로 닫혔습니다. 컬 close() 메소드에 대한 pycurl docs 따르면

:

에 대응한다 libcurl에 curl_easy_cleanup한다. 이 메소드는 Curl 객체가 더 이상 참조를 가지고 있지 않을 때 pycurl이 자동으로 호출하는 이지만 명시 적으로 호출 할 수도 있습니다.

관련 문제