我有以下函数,它通过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
函数可以在进程池中运行。
由于每个进程都是独立的,因此还应该有一个"输出队列",将结果放入其中。一个单独的过程执行一个简单的"获取",以从队列中检索所有答案。