(오래 전에) 동시 요청이 동시에 발생할 수 있도록 멀티 스레드 된 웹 스파이더를 작성했습니다. 그것은 GIL 과 멀티 스레드 코드 (IE, 대부분의 경우 물건이 직렬화됩니다!
이 코드를 다시 작성하여 더욱 강력하고 성능을 향상 시키려고합니다. 기본적으로 두 가지 방법이 있습니다. 2.6+에서 새로운 멀티 프로세싱 모듈 을 사용 하거나 일종의 리액터 / 이벤트 기반 모델을 사용할 수 있습니다. 훨씬 간단하고 오류가 적기 때문에 나중에 수행하려고합니다.
따라서 질문은 내 요구에 가장 적합한 프레임 워크와 관련이 있습니다. 다음은 지금까지 내가 알고있는 옵션 목록입니다.
- 뒤틀린 : 파이썬 반응기 프레임 워크의 할아버지 : 복잡하고 약간 부풀어 오른 것처럼 보입니다. 작은 작업을위한 가파른 학습 곡선.
- 이벤트 : lindenlab 의 사람들 로부터 . 이러한 종류의 작업에 맞춰진 Greenlet 기반 프레임 워크. 나는 코드를 살펴 보았지만 너무 아름답 지 않습니다 : pep8과 호환되지 않고 인쇄물에 흩어져 있습니다 (왜 사람들이 프레임 워크에서 이것을합니까!?), API는 약간 일치하지 않는 것 같습니다.
- PyEv : 미성숙합니다. libevent를 기반으로하지만 지금은 아무도 사용하지 않는 것처럼 보이므로 확실한 백엔드가 있습니다.
- asyncore : stdlib에서 : über low-level, 그냥 뭔가를 얻기 위해 많은 레그 워크가 필요합니다.
- 토네이도 :이 제품은 동적 웹 사이트를 위해 설계된 서버 지향 제품이지만 비동기 HTTP 클라이언트 와 간단한 ioloop를 갖추고 있습니다. 작업을 수행 할 수는 있지만 의도 한 작업이 아닌 것 같습니다. [편집 : 불행히도 Windows에서 실행되지 않습니다.이 기능은 나에게 도움이됩니다.이 절름발이 플랫폼을 지원해야합니다.]
내가 놓친 것이 있습니까? 분명히 간단한 비동기 네트워킹 라이브러리의 스위트 스팟에 맞는 라이브러리가 있어야합니다!
[편집 : 이 페이지에 대한 그의 포인터에 대해 intgr 에게 감사드립니다 . 맨 아래로 스크롤하면이 작업을 한 가지 방법으로 해결하려는 정말 훌륭한 프로젝트 목록이 표시됩니다. 실제로 Twisted가 시작된 이래로 상황이 실제로 이동 한 것 같습니다. 사람들은 이제 기존의 리액터 / 콜백 지향 솔루션이 아닌 코 루틴 기반 솔루션 을 선호하는 것 같습니다 . 이 접근법의 이점은 더 분명한 직접 코드입니다. 과거에 특히 boost.asio로 작업 할 때 발견했습니다.C ++에서 콜백 기반 코드는 따르기 어렵고 훈련되지 않은 눈에 비교적 모호한 디자인으로 이어질 수 있습니다. 코 루틴을 사용하면 적어도 좀 더 동 기적으로 보이는 코드를 작성할 수 있습니다. 이제 내 임무는이 많은 라이브러리 중 하나를 내가 좋아하는 모양으로 만들어서 해결하는 것입니다. 다행이다 …]
[편집 : 아마도 다음에 또는 어떤 의미에서이 주제에 대한이이 질문이나 염려에 우연히 사람의 관심 : 난의 현재 상태 정말 좋은 작성자 발견 가능한 도구를 이 작업]
답변
경량 스레딩을 위해 Stackless Python 마이크로 스레드 또는 Greenlets에 의존 하는 동시성 Python 모듈이 마음에 들었습니다 . 모든 차단 네트워크 I / O는 단일 libevent
루프를 통해 투명하게 비동기 적으로 이루어 지므로 실제 비동기 서버만큼 효율적이어야합니다.
이런 식으로 Eventlet과 비슷하다고 가정합니다.
단점은 API가 Python의 sockets
/ threading
모듈 과 상당히 다르다는 것입니다 . 응용 프로그램의 상당 부분을 다시 작성하거나 호환성 심 레이어를 작성해야합니다.
편집 : 또한있을 것으로 보인다 열병합 유사하다, 그러나 파이썬 2.5의 사용 개선 발전기를 대신 Greenlets의 그 코 루틴을 위해. 이것은 동시성 및 다른 대안보다 이식성이 뛰어납니다. 네트워크 I / O는 epoll / kqueue / iocp를 사용하여 직접 수행됩니다.
답변
뒤틀린 것은 복잡합니다. 뒤틀린 것은 팽창 되지 않습니다 .
여기 ( http://twistedmatrix.com/trac/browser/trunk/twisted) 를 살펴보면 체계적이고 포괄적이며 잘 테스트 된 많은 인터넷 프로토콜 모음과 작성하는 도우미 코드가 있습니다. 매우 정교한 네트워크 응용 프로그램을 배포합니다. 나는 팽창과 포괄 성을 혼동하지 않을 것이다.
Twisted 문서는 언뜻보기에 가장 사용자 친화적이지 않은 것으로 잘 알려져 있습니다. 그러나 시간을 내면 트위스트는 놀랍습니다 (IMHO). 나는 그만한 가치가있는 것으로 판명되었으며 다른 사람들에게도 같은 것을 시도해 볼 것을 권합니다.
답변
API 측면에서는 표준 라이브러리 (특히 스레딩 및 다중 처리 모듈)와 동일한 규칙을 준수합니다. 따라서 대기열 및 이벤트 와 같은 익숙한 기능 이 있습니다.
리액터 구현으로 libevent ( update : libev since 1.0 ) 만 지원 하지만 libevent-http 기반의 빠른 WSGI 서버를 특징으로하며 대부분의 다른 라이브러리와 같은 스레드 풀을 사용하는 대신 libevent-dns를 통해 DNS 쿼리를 해결합니다. 하다. ( 업데이트 : 1.0 c-ares부터 비동기 DNS 쿼리를 만드는 데 사용되며 스레드 풀도 옵션입니다.)
eventlet과 마찬가지로 greenlet을 사용하여 콜백 및 지연을 불필요하게 만듭니다 .
여러 URL의 동시 다운로드 , 긴 폴링 웹챗 예를 확인하십시오 .
답변
정말 흥미로운 비교 와 같은 프레임 워크는 자신의 블로그에 니콜라스 피엘로 컴파일 : 그것은 가치가 읽기 물론입니다!
답변
이러한 솔루션 중 어느 것도 GIL이 CPU 병렬 처리를 방지한다는 사실을 피할 수는 없습니다. 스레드와 함께 이미 가지고있는 IO 병렬 처리를 얻는 더 좋은 방법 일뿐입니다. 더 나은 IO를 할 수 있다고 생각한다면, 반드시 이들 중 하나를 추구하십시오. 그러나 병목 현상이 결과를 처리하는 경우 멀티 프로세싱 모듈을 제외하고는 아무런 도움이되지 않습니다.
답변
Twisted bloated까지는 가지 않겠지 만 머리를 감는 것은 어렵습니다. 나는 항상 ‘작은 작업’을 위해 조금 더 쉬운 것을 원했기 때문에 꽤 오랫동안 학습에 정착하지 않았습니다.
그러나 이제는 함께 작업 했으므로 모든 배터리를 포함시키는 것이 매우 좋습니다.
내가 작업 한 다른 모든 비동기 라이브러리는 표시보다 성숙도가 떨어집니다. 트위스티드의 이벤트 루프는 확실합니다.
가파른 꼬인 학습 곡선을 해결하는 방법을 잘 모르겠습니다. 이전 버전과의 호환성 문제와 죽은 프로젝트를 제거하는 것과 같이 누군가가 포크로 만들고 몇 가지를 정리하면 도움이 될 수 있습니다. 그러나 그것이 내가 생각하는 성숙한 소프트웨어의 본질입니다.