2012-11-07 7 views

답변

2

yfrog, 인스 타 그램, twitpic 등에서 12k ~ 12k의 사진을 다운로드 할 때 gevent를 사용했습니다. 사진의 누적 크기는 1.5Gb 였고 집에서 Wi-Fi로 다운로드하는 데는 20 분 정도 걸렸습니다. .

이렇게하려면 주어진 URL에서 그림을 다운로드 한 다음 을 사용하여 image_download 함수에서 비동기 적으로 URL 목록을 매핑 한 image_download 함수를 구현했습니다.

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

흥미로운 예입니다. 공유해 주셔서 감사합니다. gevent.spawn 대신 pool.map을 사용하는 이유는 무엇입니까? 그들간에 차이점이 있습니까? – JohnJ

+0

http://sdiehl.github.com/gevent-tutorial/을보십시오. 내 느낌은''Pool.map()''이 결과 수집을 처리하고 모든 결과 목록을 가져와야한다는 것입니다. ''spawn()''을 사용하여 동일하게 처리 할 수 ​​있습니다. 나는 그것이''map()''과 잘 작동한다는 것을 알고있다. –

+0

예 튜토리얼을 보았습니다. 결과를 수집하기 위해 gevent.joinall을 사용하여 결과 컬렉션을 수행했습니다. 통찰력을 가져 주셔서 감사합니다. – JohnJ