同步文件下载python和qt

时间:2010-08-23 10:07:11

标签: python multithreading qt download

在我的程序中,我需要同时下载3-4个文件(来自不同的服务器,这些文件非常慢)。我知道涉及python线程或qt线程的解决方案,但我想知道:因为它似乎是一个非常常见的任务,也许有一个库,我用url提供并只是接收文件? 提前谢谢!

2 个答案:

答案 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/获得了一个简洁的教程。