2011-08-02 3 views
3

처음에는 파이썬에 익숙하지 않아 아래 코드가 가장 깨끗하지 않을 수 있습니다. 프로그램의 경우 약 500 개의 웹 페이지를 다운로드해야합니다. URL은 이전 함수로 채워진 배열에 저장됩니다. 다운로드 부분은 다음과 같습니다 :파이썬 - ~ 500 웹 페이지 (루프)의 빠른 다운로드

각 파일은 약 20KB이지만 모든 파일을 다운로드하려면 최소한 10 분이 걸립니다. 결합 된 전체 크기의 파일 하나를 다운로드하는 데는 1-2 분 정도 소요됩니다. 이 속도를 낼 수있는 방법이 있습니까? 감사합니다

편집 : 관심 누군가에게http://code.google.com/p/workerpool/wiki/MassDownloader의 예를 다음 50 개 스레드를 사용하여, 다운로드 시간이 원래 십분 플러스에서 20 초로 감소되었습니다. 다운로드 속도는 스레드가 약 60 스레드까지 증가 할 때까지 계속 줄어들어 그 후에 다운로드 시간이 다시 증가하기 시작합니다.

답변

4

하지만 여기에서는 하나의 파일을 다운로드하지 않습니다. 500 개의 별도 페이지를 다운로드하고 있으며 각 연결에는 오버 헤드 (처음 연결시)와 서버가 수행중인 다른 작업 (다른 사람들을위한 것인가?)이 포함됩니다.

어느 쪽이든, 500x20kb를 다운로드하는 것은 그 크기의 단일 파일을 다운로드하는 것과 동일하지 않습니다.

+0

더 빠른 방법이있는 것처럼 동일한 시간이 걸릴 것이라고 나는 말하지 않았다. – Tim

3

스레드를 사용하여 실행 속도를 크게 높일 수 있습니다 (서버에 과부하가 걸리지 않도록주의하십시오).

소개 자료/코드 샘플 :

+2

500 개의 로컬 스레드를 실행하는 것은 다소 비쌉니다. 웹 서버에서 500 개의 동시 적중을하면 친숙하지 않은 로컬 sysadmin 또는 AUP 위반에 대한 단순한 금지에서 방문을 얻을 수 있습니다. (훨씬 작은) 스레드 풀에 작업을 공급하는 것을 고려하십시오. –

+0

완벽한, 이것에게 줄 것이다. 위의 예제 중 하나에서 한 번에 5 개의 스레드를 사용합니다. 감사합니다 – Tim

+0

또는 꼬인 또는 다중 처리 또는 다른 알맞은 동시성 방법. –

2

당신은 greenlet를 사용할 수 있습니다 그렇게 할 수 있습니다. eventlet lib 디렉토리와

예컨대 : 풀에서

urls = [url1, url2, ...] 

import eventlet 
from eventlet.green import urllib2 

def fetch(url): 
    return urllib2.urlopen(url).read() 

pool = eventlet.GreenPool() 

for body in pool.imap(fetch, urls): 
    print "got body", len(body) 

모든 통화는 의사 simulatneous 될 것입니다.

물론 pip 또는 easy_install을 사용하여 eventlet을 설치해야합니다.

당신은 파이썬으로 그린렛을 여러 가지 구현합니다. 당신은 gevent 또는 다른 것과 동일하게 할 수 있습니다.

+0

녹색 알레르기가 아닌 쓰레드는 +1입니다. –

0

일종의 동시성을 사용하는 것 외에도 HTTP 1.1 연결 지속성을 사용하여 요청을 만드는 데 사용하는 모든 방법을 확인하십시오. 이렇게하면 각 스레드가 단일 연결 만 열고 각 요청에 대해 TCP/IP 설정/해제를하는 대신 모든 페이지를 요청할 수 있습니다. urllib2가 기본적으로 그렇게하는지 확실하지 않습니다. 당신은 자신의 롤백해야 할 수도 있습니다.