2012-11-07 44 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