【发布时间】:2012-11-07 15:07:16
【问题描述】:
我想知道是否有人尝试使用 [gevent][1] 和 [socksipy][2] 进行并发下载。
【问题讨论】:
标签: python asyncsocket gevent greenlets
我想知道是否有人尝试使用 [gevent][1] 和 [socksipy][2] 进行并发下载。
【问题讨论】:
标签: python asyncsocket gevent greenlets
我使用 gevent 从 yfrog、instagram、twitpic 等下载了大约 12k 张图片。 图片的累积大小约为 1.5Gb,在我家的 wifi 上下载它们需要大约 20 分钟。
为此,我实现了一个 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,总运行时间没有增加。
【讨论】:
Pool.map() 为您处理结果收集,我需要获取所有结果的列表。可能你可以使用spawn() 来做同样的事情。我只知道它与map() 配合得很好。