2011-04-19 12 views
10

저는 파이썬에서 프로그램과 같은 프록시를 작성해야합니다. 작업 흐름은 웹 프록시와 매우 유사합니다. 이 프로그램은 클라이언트와 서버 사이에 위치하여 클라이언트가 서버로 보낸 요청을 수용하고 요청을 처리 한 다음 원래 서버로 보냅니다. 물론 사용되는 프로토콜은 개인 프로토콜이 TCP를 사용한다는 것입니다.믹스 파이썬 다중 처리로 비틀 었습니까?

노력을 최소화하기 위해 Python Twisted를 사용하여받는 요청 (이 부분이 서버 역할)과 재전송 (이 부분이 클라이언트 역할)을 처리하려고합니다.

성능을 극대화하려면 프로그램을 세 부분 (프로세스)으로 구분하는 파이썬 다중 처리 (스레딩에 GIL 제한 있음)를 사용하고 싶습니다. 첫 번째 프로세스는 Twisted를 실행하여 요청을 받고 큐에 요청을 보내고 즉시 원래 클라이언트로 성공을 반환합니다. 두 x 째 프로세스는 큐에서 요청을 가져오고 요청을 더 처리하여 다른 큐에 넣습니다. 세 번째 프로세스는 두 번째 큐에서 요청을 가져 와서 원래 서버로 보냅니다.

필자는 Python Twisted의 새로운 코너였습니다. 이벤트 중심이라는 것을 알고 있었고, Twisted와 스레딩 또는 멀티 프로세싱을 섞지 않는 것이 좋다고 들었습니다. 그래서 나는이 방법이 적절한지 또는 단지 Twisted를 사용하여 더 우아한 방법이 있는지 알지 못합니다.

+0

을 나는 3 개 프로세스 대신 1 중복을 사용하여 생각한다. 첫 번째 프로세스와 마지막 프로세스는 CPU 바인딩 프로세스를 수행하지 않습니다 ... 단지 IO 바인딩입니다. 실제로 스레드를 전혀 사용하지 않고 비동기/이벤트 기반 논리만으로 모든 것을 단일 Twisted reactor 프로세스에 넣으면보다 유지 보수가 가능하고 성능이 향상됩니다. –

답변

4

ampoule 내가 질문을 읽을 때 가장 먼저 생각하는 것입니다.

이것은 간단한 프로세스 풀 구현으로 AMP protocol을 사용하여 통신합니다. deferToAMPProcess 기능을 사용하면 매우 편리합니다.

17

Twisted는 multiprocessing 모듈보다 (내 겸손하지만 올바른, 의견으로는) 하위 프로세스를 실행하는 자체 이벤트 기반 방식을 가지고 있습니다. 핵심 API는 spawnProcess이지만 ampoule 같은 도구는 상위 수준의 래퍼를 제공합니다.

spawnProcess을 사용하는 경우 Twisted에서 다른 이벤트를 처리하는 것과 같은 방법으로 하위 프로세스의 출력을 처리 할 수 ​​있습니다. multiprocessing을 사용하는 경우 스레드가 사용할 수있는 일반 callFromThread API가 다른 프로세스에서 작동하지 않으므로 하위 프로세스에서 Twisted 메인 루프로 출력하는 방식을 자체 큐 기반으로 개발해야합니다. 당신이 그것을 부르는 방식에 따라, 그것은 반응기를 피클하려고하거나 단지 하위 공정에서 다른 비 작동 원자로를 사용합니다; 어느 쪽이든 그것은 영원히 당신의 부름을 잃을 것입니다.

+0

이것은 내가 예상했던 대답처럼 보입니다. Glyph에게 감사드립니다. 그러나 나는 여전히 Twisted를 배우는 중이며 Twisted에서 'spawnProcess'또는 'callFromThread'와 같은 용어가 무엇을 의미하는지 이해하지 못하고, 코드 작성을 시작할 때 다시 알려 드리겠습니다. – benhengx

+1

'spawnProcess'는 항상 링크 였지만 이제는'callFromThread'도 마찬가지입니다. 그들은 Twisted API 문서로 데려 갈 것이며 잘하면 그것이 무엇인지에 대해 명확하게 알 수있을 것입니다. :) – Glyph

+1

api 문서보다 접근하기 쉬운 문서 : [프로세스 사용] (https://twistedmatrix.com/documents/current/core/howto/process.html) – jfs

0

http://us.pycon.org/2010/conference/schedule/event/73/에 설명 된대로 협업 멀티 태스킹 기술을 시도해 볼 수 있습니다. 그것은 Glyph와 같은 기술에 simillar menitioned하고 시도해 볼만한 가치가있어.

당신은 트위스트와 함께 ZeroMQ를 사용하려고 수 있지만 지금은 정말 열심히 실험입니다 :)