并行和异步运行许多文件系统操作



我有以下函数,它通过HTTP:返回文件大小

def GetFileSize(url):
    " Function gets a url and returns it's filesize in bytes "
    url = url.replace(' ', '%20')
    u = urllib2.urlopen(url)
    meta = u.info()
    file_size = int(meta.getheaders("Content-Length")[0])
    return file_size

我想从给定的链接中获得最大的文件,我为它编写了以下函数:

def GetBiggestFile(links):
    " Function gets a list of links and returns the biggest file and his size in bytes "
    dic = {}
    for link in links:
        filename = link.split('/')[-1]
        filesize = GetFileSize(link)
        dic[link] = filesize
        print "%s | %.2f MB" % (filename, filesize / 1024.0 / 1024.0)
    biggest_file = max(dic, key=dic.get)
    return biggest_file, dic[biggest_file]

我的列表有几十个链接,因此这个脚本需要一些时间才能完成。使用线程,我可以同步获取不同的文件大小,并缩短代码的运行时间。

我不太确定如何做到这一点——我尝试过使用一个使函数异步运行的装饰器:

def run_async(func):
    " Decorator for running functions asynchronously. "
    from threading import Thread
    from functools import wraps
    @wraps(func)
    def async_func(*args, **kwargs):
        func_hl = Thread(target = func, args = args, kwargs = kwargs)
        func_hl.start()
        return func_hl
    return async_func

但我不知道如何让我的代码等待所有答案,然后再决定谁是最大的文件。

谢谢。

您会更喜欢多处理。

从这个例子开始:http://docs.python.org/library/multiprocessing.html#using-员工

您的GetFileSize函数可以在进程池中运行。

由于每个进程都是独立的,因此还应该有一个"输出队列",将结果放入其中。一个单独的过程执行一个简单的"获取",以从队列中检索所有答案。

最新更新