2010-05-13 2 views
10

작은 웹 크롤러를 파이썬으로 작성하려고합니다. 스레드를 다운로드하고 풀 처리 결과를 하나씩 풀어서 다중 스레드 스크립트로 작성하는 방법을 조사하기 시작했습니다. GIL 때문에 실제로 다운로드를 동시에합니까? GIL은 웹 크롤러에 어떤 영향을 줍니까? 각 스레드가 소켓에서 데이터를 선택하고 다음 스레드로 이동하여 소켓에서 데이터를 선택하도록합니다.Python의 멀티 스레드 크롤러가 실제로 작업 속도를 향상시켜 줍니까?

기본적으로 나는 파이썬에서 멀티 스레드 크롤러를 수행하는 것이 정말 많은 성능 대 싱글 스레드를 구매할 것이라고 묻는 중입니까?

감사합니다.

답변

1

크롤링과 관련하여 비 블로킹 비동기 소켓 작업을 사용하여 각각을 차단하지 않고 데이터를 가져 와서 반품하는 이벤트 기반 (예 : Twisted)을 사용하는 것이 더 나을 것입니다.

비동기 네트워크 작업은 일반적으로 단일 스레드 일 수 있으며 일반적으로 단일 스레드입니다. 비동기 작업이 스레드보다 훨씬 가벼우므로 async가 빛나는 곳에서 페이지가 얼마나 오래 돌아갈 지 모르기 때문에 네트워크 I/O는 거의 항상 CPU보다 대기 시간이 길다.

편집 : 여기 Twisted의 getPage를 사용하여 간단한 웹 크롤러를 만드는 방법에 대한 simple example입니다.

+0

Twisted를 사용하지 마십시오. gevent를 사용하십시오. 그것은 커버 아래에서 async io를 사용하지만 당신은 간단한 멀티 스레드 방식으로 코딩 할 수 있습니다. –

8

GIL은 네트워크 작업을 수행 할 때 파이썬 인터프리터가 보유하지 않습니다. 네트워크에 연결된 작업 (예 : 크롤러)을 수행하는 경우 GIL의 영향을 무시해도됩니다.

반면에 처리하는 스레드를 많이 만들면 (다운로드 후) 성능을 측정 할 수 있습니다. 거기에 스레드 수를 제한하면 GIL이 성능에 미치는 영향을 줄일 수 있습니다.

6

scrapy의 작동 방식을 확인하십시오. 그것은 당신을 많이 도울 수 있습니다. 스레드를 사용하지는 않지만 동일한 스레드에서 여러 개의 "동시"다운로드를 수행 할 수 있습니다.

생각해 보면 네트워크 카드가 하나뿐이므로 병렬 처리가 정의에 도움이되지 않습니다.

의 치료법은 하나의 요청을 응답하기 전에을 기다리지 않고 그냥 보내야합니다. 모두 한 스레드에 있습니다.

1

또 다른 고려 사항 : 단일 웹 사이트를 고치고 서버가 IP 주소에서 보낼 수있는 요청 빈도에 제한을 둔다면 여러 스레드를 추가해도 아무런 효과가 없을 수 있습니다.

0

예, 멀티 스레딩 긁기는 프로세스 속도를 크게 향상시킵니다. GIL이 문제가되는 경우는 아닙니다. 완료 대기중인 CPU 및 사용되지 않은 대역폭이 많이 손실됩니다. 스크래핑하는 웹 페이지가 로컬 네트워크에있는 경우 (희귀 한 스크래핑의 경우)에는 멀티 스레딩과 단일 스레드 스크래핑의 차이가 더 작을 수 있습니다.

하나의 "n"개의 스레드로 벤치 마크를 시도해 볼 수 있습니다. Discovering Web Resources에 간단한 멀티 스레드 크롤러를 작성했으며 Automated Discovery of Blog Feeds and Twitter, Facebook, LinkedIn Accounts Connected to Business Website에 관련 기사를 작성했습니다. FocusedWebCrawler에서 NWORKERS 클래스 변수를 변경하는 데 사용할 스레드 수를 선택할 수 있습니다.