파이썬의 트위스트에 대한 깨끗하고 가벼운 대안? [닫은]
(오래 전에) 동시 요청이 동시에 발생할 수 있도록 멀티 스레드 된 웹 스파이더를 작성했습니다. 그것은 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에 이르기까지는 가지 않지만 머리를 감는 것은 어렵습니다. 나는 항상 '작은 작업'을 위해 조금 더 쉬운 것을 원했기 때문에 꽤 오랫동안 학습에 정착하지 않았습니다.
그러나 이제는 함께 작업 했으므로 모든 배터리를 포함시키는 것이 매우 좋습니다.
내가 작업 한 다른 모든 비동기 라이브러리는 심지어 보이는 것보다 덜 성숙합니다. 트위스티드의 이벤트 루프는 확실합니다.
가파른 꼬인 학습 곡선을 해결하는 방법을 잘 모르겠습니다. 이전 버전과의 호환성 문제와 죽은 프로젝트를 제거하는 것과 같이 누군가가 포크로 만들고 몇 가지를 정리하면 도움이 될 수 있습니다. 그러나 이것이 내가 생각하는 성숙한 소프트웨어의 본질입니다.
Kamaelia 는 아직 언급되지 않았습니다. 동시성 모델은받은 편지함과 보낼 편지함간에 메시지가 전달되는 구성 요소를 함께 연결하는 것을 기반으로합니다. 다음 은 간단한 개요입니다.
나는 몇 가지 일에 꼬임을 사용하기 시작했습니다. 그것의 아름다움은 거의 그것이 부풀어 오르기 때문입니다. 거의 모든 주요 프로토콜에 대한 커넥터가 있습니다. 명령을 가져 와서 irc 서버에 게시하고, 누군가에게 이메일로 보내거나, 명령을 실행하고, NNTP 서버에서 읽고 변경 사항이 있는지 웹 페이지를 모니터링하는 Jabber 봇이있을 수 있습니다. 나쁜 소식은 모든 것을 할 수 있고 OP와 같은 간단한 작업을 위해 일을 지나치게 복잡하게 만들 수 있다는 것입니다. 파이썬의 장점은 필요한 것만 포함한다는 것입니다. 따라서 다운로드는 20MB 일 수 있지만 2MB의 라이브러리 만 포함 할 수 있습니다 (여전히 많음). 트위스트에 대한 나의 가장 큰 불만은 예제가 포함되어 있지만 기본 TCP 서버를 넘어서는 것입니다.
파이썬 솔루션은 아니지만 node.js가 최근에 더 많은 견인력을 얻었습니다. 사실 나는 더 작은 프로젝트를 조사하는 것을 고려했지만 자바 스크립트를 들으면 울었습니다. :)
Abe Fettig의 "Twisted Network Programming Essentials"라는 주제에 관한 좋은 책이 있습니다. 예제는 매우 파이썬적인 코드를 작성하는 방법을 보여줍니다. 개인적으로 부풀린 프레임 워크를 기반으로 나를 때리지 않습니다. 책의 해결책을 살펴보십시오. 깨끗하지 않으면 깨끗하다는 것이 무엇인지 모르겠습니다.
내 유일한 수수께끼는 Ruby와 같은 다른 프레임 워크와 동일합니다. 걱정 되나요? 확장 성 문제가있는 프레임 워크에 클라이언트를 커밋하는 것을 싫어합니다.
Whizzer 는 pyev를 사용하는 작은 비동기 소켓 프레임 워크입니다. 주로 pyev 때문에 매우 빠릅니다. 약간의 변경으로 꼬인 비슷한 인터페이스를 제공하려고 시도합니다.
또한 Syncless 시도 하십시오 . 그것은 코 루틴 기반입니다 (따라서 Concurrence, Eventlet 및 gevent와 유사합니다). socket.socket, socket.gethostbyname (등), ssl.SSLSocket, time.sleep 및 select.select에 대한 드롭 인 비 차단 대체를 구현합니다. 빠릅니다. Stackless Python과 libevent가 필요합니다. C (Pyrex / Cython)로 작성된 필수 Python 확장이 포함되어 있습니다.
나는 syncless 의 장점을 확인합니다 . libev (새롭고 깨끗하며 성능이 우수한 libevent 버전)를 사용할 수 있습니다. 몇 번 전에 libevent만큼 많은 지원을 제공하지는 않지만 이제 개발 프로세스가 진행되어 매우 유용합니다.
간단하고 가벼운 HTTP 요청 라이브러리를 원한다면 Unirest가 정말 좋습니다.
PyWorks를 살펴 보는 것은 매우 다르며, 이는 상당히 다른 접근법을 취합니다. 객체 인스턴스가 자체 스레드에서 실행되도록하고 해당 객체에 대한 함수 호출을 비동기로 만듭니다.
클래스가 객체 대신 Task에서 상속하도록하고 비동기입니다. 모든 메서드 호출은 프록시입니다. 반환 값 (필요한 경우)은 미래 프록시입니다.
res = obj.method( args )
# code continues here without waiting for method to finish
do_something_else( )
print "Result = %d" % res # Code will block here, if res not calculated yet
PyWorks는 http://bitbucket.org/raindog/pyworks 에서 찾을 수 있습니다
참고 URL : https://stackoverflow.com/questions/1824418/a-clean-lightweight-alternative-to-pythons-twisted
'IT story' 카테고리의 다른 글
PHP를 사용하여 XML 파일을 동적으로 생성하는 방법은 무엇입니까? (0) | 2020.04.25 |
---|---|
입력 크기 대 너비 (0) | 2020.04.24 |
Windows를위한 최고의 무료 C ++ 프로파일 러 란 무엇입니까? (0) | 2020.04.24 |
RewriteBase는 .htaccess에서 어떻게 작동합니까 (0) | 2020.04.24 |
WPF의 페이지 대 창? (0) | 2020.04.24 |