2010-08-23 8 views
2

제 프로그램에서 (매우 느린 다른 서버에서) 3-4 개의 파일을 동시에 다운로드해야합니다. 파이썬 스레드 또는 Qt 스레드 관련된 솔루션을 알고 있지만 궁금하네요 : 그것은 꽤 일반적인 작업을 보인다 이후 어쩌면 내가 URL을 피드 및 단순히 파일을받을 라이브러리가? 미리 감사드립니다.동시 파일을 파이썬과 qt로 다운로드

답변

7

예, 하나가 있습니다. - pycurl.

curl은 저수준이기 때문에 '간단히'하지는 않지만 필요한 것은 정확히 수행합니다. URL을 제공하면 동시에 비동기 적으로 다운로드됩니다.

import pycurl 
from StringIO import StringIO 

def LoadMulti(urls): 
    m = pycurl.CurlMulti() 
    handles = {} 
    for url in urls: 
     c = pycurl.Curl() 
     c.setopt(pycurl.URL, url) 
     data = StringIO() 
     header = StringIO() 
     c.setopt(pycurl.WRITEFUNCTION, data.write) 
     c.setopt(pycurl.HEADERFUNCTION, header.write)     
     handles[url] = dict(data=data, header=header, handle=c) 
     m.add_handle(c) 
    while 1: 
     ret, num_handles = m.perform() 
     if ret != pycurl.E_CALL_MULTI_PERFORM: break 
    while num_handles: 
     ret = m.select(1.0) 
     if ret == -1: continue 
     while 1: 
      ret, num_handles = m.perform() 
      if ret != pycurl.E_CALL_MULTI_PERFORM: break 
    return handles 


res = LoadMulti(['http://pycurl.sourceforge.net/doc/pycurl.html', 'http://pycurl.sourceforge.net/doc/curlobject.html', 'http://pycurl.sourceforge.net/doc/curlmultiobject.html']) 
for url, d in res.iteritems(): 
    print url, d['handle'].getinfo(pycurl.HTTP_CODE), len(d['data'].getvalue()), len(d['header'].getvalue()) 

이러한 while 루프에서 GUI 업데이트를 실행하면 인터페이스가 멈추지 않습니다.

+0

멋진 답변, 감사합니다! – Tom