질문 :gevent와 다중 처리를 함께 사용하여 서브 프로세스와 통신
Windows에서 gevent와 함께 다중 처리 모듈을 효율적으로 사용할 수 있습니까?
시나리오 :
내가 Windows에서 비동기 I/O를하고 gevent 기반의 파이썬 응용 프로그램이 있습니다. 응용 프로그램은 대부분 I/O 바운드이지만 CPU로드가 증가 할 수도 있습니다. 이 응용 프로그램은 stdin 및 stdout을 통해 콘솔 응용 프로그램을 제어해야합니다. 이 콘솔 응용 프로그램을 수정할 수 없으며 사용자가 자신의 사용자 지정 응용 프로그램을 사용할 수있게되며 텍스트 (회선) 기반 통신 프로토콜 만 수정됩니다.
하위 프로세스와 스레드를 사용하여 작동하는 구현이 있지만, 하위 프로세스 기반 통신 코드를 해당 스레드와 함께 별도 프로세스로 이동하여 주 응용 프로그램을 다시 단일 스레드로 되돌릴 수 있습니다. 나는 이것을 위해 멀티 프로세싱 모듈을 사용할 계획이다.
전에 읽기 :
나는 웹에게 많은 검색 및 일부 소스 코드를 읽고, 그래서 멀티 프로세싱 모듈은 Windows에서 명명 된 파이프를 기반으로 파이프 구현을 사용하고 있음을 알 수있다. 한 쌍의 multiprocessing.queue.Queue 객체는 두 번째 파이썬 프로세스와 통신하는 데 사용됩니다. 이러한 대기열은 해당 Pipe 구현을 기반으로합니다. IPC는 명명 된 파이프를 통해 수행됩니다.
중요한 질문은 들어오는 Queue의 get 메소드를 호출하면 gevent의 주 루프를 차단하는지 여부입니다. 그 방법에 대한 타임 아웃이 있기 때문에 작은 타임 아웃으로 루프를 만들 수 있지만, 좋은 I/O 대기 시간을 저해하는 작은 시간 동안은 여전히 막을 수 있기 때문에 좋은 해결책은 아닙니다.
나는 또한 열심히 그리고 때때로 깨지기 쉬운 것으로 알려진 Windows에서 파이프를 사용하는 모든 문제를 우회하는 방법에 대한 제안에 대해 열려 있습니다. 공유 메모리 기반 IPC가 Windows에서 가능한지 아닌지 확실하지 않습니다. 어쩌면 콘솔 응용 프로그램을 네트워크 소켓을 사용하는 자식 프로세스와 통신 할 수있는 방법으로 포장 할 수 있습니다.이 소켓은 gevent와 잘 작동하는 것으로 알려져 있습니다.
가능하면 주 사용 사례에 질문하지 마십시오. 감사.
Windows와 UNIX 모두에서 하위 프로세스의 파이프를 비동기 적으로 읽고 쓸 수있는 모듈을 발견했습니다. gevent의 이벤트 루프와 통합하여 상당히 일반적인 솔루션을 얻을 수 있습니다. http://code.activestate.com/recipes/440554-module-to-allow-asynchronous-subprocess-use-on-win/ – fviktor