2012-11-07 20 views

回答

2

我已经使用gevent从yfrog,instagram,twitpic等下载〜12k图片。 图片的累积大小约为1.5Gb,花费大约20分钟的时间将它们全部下载到我家的wifi上。

为此,我实现了一个image_download函数,其唯一目的是从给定URL下载图片,然后使用gevent.Pool异步映射image_download函数上的URL列表。

from gevent import monkey 
monkey.patch_socket() # See http://www.gevent.org/gevent.monkey.html 
import gevent 

NB_WORKERS = 50 

def image_download(url): 
    # retrieve image 

def parallel_image_download(urls): # urls is of type list 
    """ Activate NB_WORKERS Greenlets to asynchronously download the images. """ 
    pool = gevent.Pool(NB_WORKERS) 
    return pool.map(image_download, urls) 

注:经过几次尝试,我找到了50名并行工人。通过50,总运行时间没有增加。

+0

这是一个有趣的例子。感谢分享。我可以问你为什么使用pool.map而不是gevent.spawn吗?他们之间有区别吗? – JohnJ

+0

看看http://sdiehl.github.com/gevent-tutorial/。我觉得''Pool.map()''为你处理搜索结果,我需要得到所有结果的列表。也许你可以用''spawn()''来做同样的事情。我只知道它使用'map()'很好。 –

+0

是的,我见过那个教程。那么收集结果我使用gevent.joinall做结果收集。感谢您的见解。 – JohnJ