【发布时间】:2010-08-23 10:07:11
【问题描述】:
在我的程序中,我需要同时下载 3-4 个文件(从速度很慢的不同服务器)。我知道涉及 python 线程或 qt 线程的解决方案,但我想知道:因为这似乎是一个很常见的任务,也许有一个库,我用 url 提供并简单地接收文件? 提前致谢!
【问题讨论】:
标签: python multithreading qt download
在我的程序中,我需要同时下载 3-4 个文件(从速度很慢的不同服务器)。我知道涉及 python 线程或 qt 线程的解决方案,但我想知道:因为这似乎是一个很常见的任务,也许有一个库,我用 url 提供并简单地接收文件? 提前致谢!
【问题讨论】:
标签: python multithreading qt download
是的,有一个 - 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 更新,因此界面不会冻结。
【讨论】:
你真的不需要图书馆;这是线程的简单使用(嗯,因为线程可以是“简单的”)。参见例如http://www.artfulcode.net/articles/multi-threading-python/ 提供简洁的教程。
【讨论】: