在我的程序中,我需要同时下载3-4个文件(来自不同的服务器,这些文件非常慢)。我知道涉及python线程或qt线程的解决方案,但我想知道:因为它似乎是一个非常常见的任务,也许有一个库,我用url提供并只是接收文件? 提前谢谢!
答案 0 :(得分:7)
是的,有一个 - pycurl。
它不是'简单',因为curl是低级的,但它完全符合你的需要 - 你提供了一些网址,然后同时和异步下载。
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更新,因此界面不会冻结。
答案 1 :(得分:3)
你真的不需要图书馆;这是一个简单的线程使用(好吧,因为线程可以'简单')。参见例如http://www.artfulcode.net/articles/multi-threading-python/获得了一个简洁的教程。