【问题标题】:simultaneous files downloading in python and qt在 python 和 qt 中同时下载文件
【发布时间】:2010-08-23 10:07:11
【问题描述】:

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

【问题讨论】:

    标签: python multithreading qt download


    【解决方案1】:

    是的,有一个 - 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 更新,因此界面不会冻结。

    【讨论】:

      【解决方案2】:

      你真的不需要图书馆;这是线程的简单使用(嗯,因为线程可以是“简单的”)。参见例如http://www.artfulcode.net/articles/multi-threading-python/ 提供简洁的教程。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 2023-03-22
        • 2018-09-26
        • 1970-01-01
        • 2013-04-14
        • 2018-11-01
        相关资源
        最近更新 更多