2011-07-01 3 views
5

여러 사이트에 대한 쿼리를 수행하는 Python 스크립트를 만들려고합니다. 스크립트는 잘 작동하지만 (urllib2 사용) 단 하나의 링크에 대해서만. 다중 사이트의 경우 여러 요청을 차례로 처리하지만 매우 강력하지는 않습니다.Python : 여러 개의 쿼리를 병렬로 실행하고 첫 번째 작업 완료

쿼리가 특정 문자열을 반환 할 때 병렬로 여러 쿼리를 실행하고 다른 쿼리를 중지하는 이상적인 솔루션 (내가 추측하는 스레드)은 무엇입니까? ...

나는이 질문을 발견하지만 난 나머지 스레드를 중지로 변경하는 방법을 발견하지 않았습니다 : Python urllib2.urlopen() is slow, need a better way to read several urls

사전에 감사합니다!

답변

0

보통이 다음과 같은 패턴 (죄송합니다, 내 파이썬 기술이 그렇게 좋지 않다)로 구현된다 (나는 영어로 실수를하면 미안 해요 ^^ 프랑스어 해요).

Runner라는 클래스가 있습니다. 이 클래스는 필요한 정보를 얻는 장기 실행 메서드를 가지고 있습니다. 또한, Cancel 메서드를 사용하여 장기 실행 메서드를 어떤 식 으로든 중단합니다 (URL 요청 개체를 클래스 멤버 필드로 만들 수 있으므로 cancel 클래스는 request.terminate()와 같은 기능을 호출 함).

장기 실행 방법은 완료시 신호를 보내도록 콜백 함수를 받아 들일 필요가 있습니다.

그런 다음 많은 스레드를 시작하기 전에 해당 클래스의 모든 개체의 인스턴스를 만들고이를 목록에 보관하십시오. 동일한 루프에서 주 프로그램의 콜백 메소드를 전달하여 이러한 장기 실행 메소드를 시작할 수 있습니다.

그리고 콜백 메소드에서 모든 스레드 된 클래스의 목록을 살펴보고 cancel 메소드를 호출하면됩니다.

, 당신은 결과에 대한 multiprocessing 라이브러리, 여론 조사와 쿼리를 실행할 수 있습니다

0

: 파이썬 특정 구현에 내 대답을 편집하고, 종료는 더 이상 필요하지를 조회하시기 바랍니다. 모듈 용 Documentation에는 terminate() 메서드가있는 Process 클래스에 대한 정보가 들어 있습니다. 보낼 요청 수를 제한하려면 풀링 옵션을 확인하십시오.

2

Twisted를 사용하면 여러 요청을 동시에 처리 할 수 ​​있습니다. 내부적으로 epoll (또는 플랫폼에 따라 iocp 또는 kqueue)을 사용하여 스레드 가용성보다 TCP 가용성을 효율적으로 알립니다. 하나의 요청이 일치하면 다른 사람은 cancel입니다.

Here is the Twisted http agent tutorial.

관련 문제