subprocess
모듈을 사용하여 일부 처리를 오프로드하는 Python 모듈이 있습니다. 모듈은 stdin
및 stdout
이상의 파이프를 사용하여 subprocess.communicate
메서드를 통해 데이터를 읽고 씁니다. 서브 프로세스 중 하나가 파이썬 모듈을 다시 입력하고 또 다른 서브 프로세스를 생성합니다. 부모 하위 프로세스에서 stdin
및 stdout
파일 설명자가 사용 중이므로 응용 프로그램이 교착 상태가됩니다.Python에서 재진입하는 하위 프로세스?
어디서나 임시 파일을 만들고 정리할 필요없이이 교착 상태를 피할 수있는 방법이 있습니까?
내 시나리오는 다음과 같습니다. FastCGI 서버에서 실행되는 웹 응용 프로그램입니다. PDF 파일에 대한 요청이 있으면 하위 프로세스가 생성되어 타사 응용 프로그램 (wkhtmltopdf)을 시작하여 PDF를 작성합니다. 이 응용 프로그램은 내 FastCGI 모듈을 통해 이미지를 다운로드하기 시작합니다. 동일한 프로세스을 PDF 작성자의 부모 프로세스로 다운로드합니다. 이미지를 가져 오는 것은 subprocess
을 통해 다른 타사 응용 프로그램을 호출합니다. 이는 stdin
및 stdout
이 PDF 작성자 하위 프로세스에서 이미 사용되고 있기 때문에 교착 상태에 빠집니다.
이 문제는 this blog post (끝 부분)에서 언급되었지만 후속 솔루션이 제공되지 않았습니다. 임시 파일을 사용해야 할 수도 있지만 파이프를 선호합니다. 누구든지 전에이 문제가 발생 했습니까?
더 나은 IPC 메커니즘을 살펴 보는 것이 좋습니다. 제롬 큐 (zeromq)를 보길 원할지도 모르지만, rabbitmq와 같은 큰 메시지 서버에 의존하지 않고도 이런 일을 훨씬 쉽게 처리 할 수 있습니다. http://zguide.zeromq.org/page:all –
고맙습니다. #tom, 불행히도 FastCGI 서버는 공유 호스팅 서비스에서 실행됩니다. 하위 프로세스의 재진입 부분을 다림질하여 문제를 해결할 수 있었지만 여전히 일반적인 시나리오가 해결 가능한지 알고 싶습니다. – simonhaines
hmmm 호스트가 어떤 제한을 가지고 있는지 알 수는 없지만 셀러리 http://celeryproject.org/는 프로세스를 사용할 수 있으므로 유용 할 수도 있습니다. 코드를보고 그들이 어떻게하는지보십시오. –