Python의 트위스트에 대한 깨끗하고 가벼운 대안?
(오래 전에) 동시 요청을 실행할 수 있도록 멀티스레드한 웹스파이더를 작성했습니다.그것은 Python의 젊은 시절로, GIL과 그것이 멀티스레드 코드에 일으키는 관련 문제(즉, 대부분의 경우 시리얼화 됩니다!)에 대해 알기 전이었습니다.
이 코드를 수정하여 보다 견고하고 성능이 향상되도록 하고 싶습니다.여기에는 기본적으로 두 가지 방법이 있습니다.2.6+의 새로운 멀티프로세서 모듈을 사용할 수도 있고, 어떤 종류의 원자로/이벤트 기반 모델을 사용할 수도 있습니다.훨씬 간단하고 오류 발생률이 낮기 때문에 나중으로 하겠습니다.
그래서 질문은 어떤 프레임워크가 제 요구에 가장 적합한지에 관한 것입니다.다음은 지금까지 알고 있는 옵션 목록입니다.
- 꼬임:Python 원자로 프레임워크의 조상은 복잡하고 약간 비대해 보인다.작은 일에도, 고속의 학습 곡선.
- 이벤트렛:린든랩의 남자들한테서요이러한 태스크에 적합한 그린릿 기반 프레임워크입니다.코드를 봤는데 별로 예쁘지 않아요.PEP8에 준거하지 않고, 프린트물이 산재하고 있습니다(왜 사람들은 프레임워크에서 이것을 합니까?), API는 약간 모순된 것 같습니다.
- PyEv: 미성숙합니다.리벤트를 기반으로 하고 있기 때문에 현재 사용하고 있는 사람은 없는 것 같습니다.백엔드는 견고합니다.
- 비동기:stdlib: über low-level, 단지 무언가를 시작하기 위해 필요한 많은 다리 작업처럼 보입니다.
- 토네이도:이것은 동적 웹 사이트를 서버하도록 설계된 서버 지향 제품이지만 비동기 HTTP 클라이언트와 단순한 ioloop을 특징으로 합니다.일을 해낼 수 있을 것 같지만 의도한 것은 아니다.[edit: 유감스럽게도 Windows에서는 실행되지 않습니다.이러한 플랫폼을 지원하기 위한 요건입니다]
제가 놓친 게 있나요?심플한 비동기 네트워크 라이브러리의 스위트 스팟에 맞는 라이브러리가 분명히 있을 것입니다.
[편집: 이 페이지로 포인터를 보내주셔서 감사합니다.맨 아래까지 스크롤하면 이 태스크에 대처하기 위한 프로젝트 목록이 나타납니다.Twisted가 시작된 이래 실제로 일이 진행되어 온 것 같습니다.지금 사람들은 전통적인 원자로/콜백 지향의 솔루션보다 코루틴 기반의 솔루션을 선호하는 것 같습니다.이 접근방식의 장점은 보다 명확한 직접적인 코드입니다.특히 C++에서 boost.asio를 사용할 때 콜백 기반 코드가 따라하기 어렵고 훈련받지 않은 사람에게는 비교적 이해하기 어려운 설계로 이어질 수 있다는 것을 알게 되었습니다.코루틴을 사용하면 적어도 좀 더 동기적으로 보이는 코드를 쓸 수 있습니다.이제 내 임무는 이 많은 도서관들 중 어떤 것이 마음에 드는지 알아내서 시도해 보는 것 같아!지금 물어보길 잘했어...]
[편집: 이 질문을 따르거나 우연히 접한 사람, 또는 어떤 의미에서든 이 주제에 관심이 있는 사람은 누구나 관심을 가질 수 있습니다.이 작업에 사용할 수 있는 도구의 현재 상태에 대한 매우 훌륭한 정보를 발견했습니다.
뒤틀림은 복잡해, 네 말이 맞아.꼬여도 붓지 않아요.
여기를 봐 주세요.http://twistedmatrix.com/trac/browser/trunk/twisted 에는, 매우 고도의 네트워크 애플리케이션을 기술 및 도입하기 위한 헬퍼 코드 뿐만이 아니라, 많은 인터넷 프로토콜로 이루어진, 체계적이고, 포괄적이며, 충분한 테스트를 거친 스위트가 있습니다.나는 과장된 것을 포괄성과 혼동하지 않을 것이다.
Twisted 문서는 언뜻 보기에도 가장 사용하기 쉬운 문서가 아니라는 것은 잘 알려져 있습니다.이 때문에 유감스럽게도 많은 사람들이 거절당했다고 생각합니다.근데 시간을 들이면 트위스트(IMHO)가 정말 멋져요.해봤는데 그럴 가치가 있음이 증명되었고, 다른 사람들에게도 똑같이 해보라고 권하고 싶어요.
gevent가 eventlet 청소됩니다.
API 면에서는 표준 라이브러리(특히 스레드화 및 멀티프로세싱 모듈)와 동일한 규칙을 따릅니다.Queue나 Event와 같은 익숙한 기능을 사용할 수 있습니다.
리액터 구현으로 libevent(업데이트: 1.0 이후 libev)만 지원하지만 이를 최대한 활용할 수 있습니다.다른 대부분의 라이브러리와 마찬가지로 스레드 풀을 사용하는 것이 아니라 libevent-http 기반의 고속 WSGI 서버를 갖추고 libevent-dns를 통해 DNS 쿼리를 해결합니다.(업데이트: 1.0 c-ares는 비동기 DNS 쿼리의 스레드 풀입니다.옵션입니다.)
eventlet과 마찬가지로 greenlet을 사용하면 콜백과 지연이 불필요해집니다.
예를 들어 여러 URL 동시 다운로드, 긴 폴링 웹 채팅 등의 예를 확인하십시오.
저는 Stackless Python 마이크로스레드 또는 Greenlets 중 하나에 의존하는 Concurence Python 모듈이 마음에 들었습니다.모든 블로킹 네트워크 I/O는 1개의 네트워크 I/O를 통해 투과적으로 비동기화됩니다.libevent
실제 비동기 서버만큼 효율적입니다.
이런 면에서 이벤트렛과 비슷할 것 같아요.
단점은 API가 Python의 API와 상당히 다르다는 것입니다.sockets
/threading
모듈: 어플리케이션의 적절한 비트를 고쳐 쓸 필요가 있습니다(또는 호환성 심 레이어를 쓸 필요가 있습니다).
편집: 코루틴에는 Greenlet 대신 Python 2.5의 확장 제너레이터를 사용하는 cogen도 있는 것 같습니다.이것에 의해, 컨시스턴스나 다른 대체 수단보다 휴대성이 높아집니다.네트워크 I/O는 epoll/kqueue/iocp에서 직접 이루어집니다.
Nicholas Piél이 블로그에 올린 이러한 프레임워크의 정말 흥미로운 비교: 읽을 가치가 충분히 있습니다!
이러한 솔루션 중 어느 것도 GIL이 CPU의 병렬화를 막는다는 사실을 피할 수 없습니다.이는 스레드와 함께 이미 가지고 있는 IO 병렬화를 실현하는 더 좋은 방법입니다.I/O를 향상시킬 수 있다고 생각되면 반드시 다음 중 하나를 추구합니다.그러나 병목현상이 처리 중인 경우에는 멀티프로세싱 모듈 이외에는 아무것도 도움이 되지 않습니다.
트위스트 비대하다고까지 하진 않겠지만, 머리를 감싸기는 어렵네요.저는 항상 '작은 일'을 하기 위해 조금 더 쉬운 것을 원했기 때문에 한동안 실제로 배우는 것에 안주하는 것을 피했습니다.
하지만 이제 더 많은 작업을 해 본 결과, 모든 배터리를 포함한 것은 매우 좋은 일이라고 말할 수 밖에 없습니다.
내가 일했던 다른 모든 비동기 라이브러리는 보기보다 훨씬 성숙하지 않다.Twisted의 이벤트 루프는 솔리드입니다.
나는 가파른 왜곡 학습 곡선을 어떻게 풀어야 할지 잘 모르겠다.만약 누군가가 그것을 분리하여 하위 호환성 문제나 고장난 프로젝트를 모두 제거하는 등 몇 가지 사항을 정리해주면 도움이 될 수 있습니다.하지만 그것이 성숙한 소프트웨어의 특성이라고 생각합니다.
카멜리아는 아직 언급되지 않았다.동시성 모델은 수신 트레이와 송신 박스 사이를 통과하는 메시지와 함께 컴포넌트를 배선하는 것에 근거하고 있습니다.여기 간단한 개요가 있습니다.
나는 어떤 것들에 트위스트를 사용하기 시작했다.그것의 아름다움은 거의 그것이 "피투성이"이기 때문이다.거의 모든 주요 프로토콜에 대한 커넥터가 있습니다.명령어를 받아 irc 서버에 투고하고, 전자 메일로 전송하고, 명령을 실행하고, NNTP 서버에서 읽고, 웹 페이지의 변경을 감시하는 jabber 봇을 사용할 수 있습니다.단점은 이 모든 작업을 수행할 수 있으며 운영 체제에서 설명한 것처럼 간단한 작업에는 작업이 지나치게 복잡해질 수 있다는 것입니다.파이썬의 장점은 필요한 것만 포함한다는 것입니다.따라서 다운로드가 20MB일 수도 있지만 2MB 라이브러리만 포함할 수도 있습니다(여전히 많은 양입니다).트위스트에 대한 나의 가장 큰 불만은 기본적인 tcp 서버를 넘어서는 모든 것을 예로 들 수 있지만 당신이 알아서 할 수 있다는 것입니다.
python 솔루션은 아니지만 node.js는 최근 훨씬 더 많은 관심을 받고 있습니다.사실 소규모 프로젝트를 위해 알아보는 것도 고려했지만 javascript를 들으면 망설여집니다.
이 주제에 관한 좋은 책이 있다: 아베 페티그의 "트위스트 네트워크 프로그래밍 에센셜"이 예들은 매우 피토닉한 코드를 어떻게 쓰는지를 보여주며, 개인적으로 저는 비대해진 틀에 기초한 것처럼 생각하지 않습니다.책에 있는 해결책을 보세요. 깨끗하지 않다면, 깨끗하다는 게 무슨 뜻인지 모르겠어요.
나의 유일한 수수께끼는 루비 같은 다른 프레임워크와 같은 것이다.걱정되네요, 확장되나요?확장성 문제가 발생할 수 있는 프레임워크에 클라이언트를 맡기고 싶지 않습니다.
Whizer는 pyev를 사용하는 작은 비동기 소켓 프레임워크입니다.매우 빠릅니다. 주로 피예프 때문입니다.약간의 변경으로 비틀어진 유사한 인터페이스를 제공하려고 합니다.
Syncless도 시도해 보세요.Coroutine 기반(Concurence, Eventlet 및 Gevent와 유사)입니다.소켓에 대한 드롭인 논블로킹 대체 기능을 구현합니다.socket, socket.gethostbyname(등), ssl.SSLSocket, 시간.sleep and select.셀렉트, 빨라요Stackless Python과 libevent가 필요합니다.C(Pyrex/Cython)로 작성된 필수 Python 확장자를 포함합니다.
동기화되지 않는 것의 장점을 확인합니다.libev(libev의 새롭고 깨끗하고 성능 좋은 버전)를 사용할 수 있습니다.얼마 전에는 libevent만큼 많은 지원을 받지 못했지만, 지금은 개발 과정이 더 진전되어 있습니다.syncless
매우 편리합니다.
단순하고 가벼운 HTTP 요청 라이브러리만 원한다면 Unirest가 매우 좋습니다.
PyWorks는 전혀 다른 접근방식을 취합니다.오브젝트 인스턴스가 자체 스레드에서 실행되도록 하고 해당 오브젝트에 대한 함수 호출을 비동기화합니다.
클래스가 오브젝트 대신 태스크에서 상속되고 비동기일 경우 모든 메서드 호출이 프록시입니다.반환 값(필요한 경우)은 미래 프록시입니다.
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
'programing' 카테고리의 다른 글
비활성화 버튼에서 부트스트랩 툴팁을 활성화하는 방법 (0) | 2022.10.15 |
---|---|
SQL은 정확히 3주 전에 마지막으로 업데이트된 DATETIME 필드를 가져옵니다. (0) | 2022.10.15 |
오류로 인해 MariaDB 백업 도구 Mariabackup이 실패 (0) | 2022.10.15 |
PHP의 'explode'는 Python에게 어떤 의미입니까? (0) | 2022.10.15 |
Spring의 ScriptUtils는 덤프에 코멘트가 포함된 코드를 무시합니다. (0) | 2022.10.15 |