2011-02-27 9 views
3

저는 Fedora 14에서 Cherokee를 실행하는 개발 서버를 설정했고, uWSGI를 사용하여 WSGI 응용 프로그램과 인터페이스했습니다. 응용 프로그램이 첫 번째 요청과 충돌하는 경우파이썬 하위 프로세스. uWSGI에서 느리게 실행합니다.

, 나는 과정과 같이 산란 :

from subprocess import Popen 
Popen(['bash']) # bash is just an example; the problem happens with all programs 

첫 번째 요청은 (이후의 것들 초 미만을) 완료 10 ~ 15 초 정도 걸립니다. Popen 개체를 만들지 않고 첫 번째 요청을 완료하는 데 약 2-3 초 밖에 걸리지 않습니다. 파이썬 쉘에서 같은 Popen 요청을 실행할 때, 즉각적입니다.

이 문제의 원인은 무엇입니까? 나는 명백한 것을 놓쳤는가? 당신이 당신의 파이썬 코드에서이를 처리하려는 경우

답변

10

--close-on-exec

그렇지 않으면 새로운 프로세스가 소켓

(이것은 UNIX 표준 동작입니다)

+0

더 자세히 설명해 주시겠습니까? "소켓을 상속 받음"이란 정확히 무엇을 의미합니까? (이 글을 처음 접했을 때) – Cameron

+0

내 uWSGI XML 설정 파일에''를 추가해 보았는데 문제가 해결되었습니다. 정말 고마워! 이것은 uWSGI의 문서화되지 않은 옵션 인 것 같습니다. - [docs] (http://projects.unbit.it/uwsgi/wiki/Doc)에서 찾을 수 없습니다. 곧 추가 될 가능성은? – Cameron

+0

http://en.wikipedia.org/wiki/Fork_%28operating_system%29 in unix 새로운 프로세스를 생성 할 때마다 부모에 의해 열린 모든 파일 설명자를 얻습니다. 그래서 Popen을 worker에서 호출하면 새로운 프로세스가 웹 서버 소켓을 상속받습니다. 이 경우 하위 프로세스가 끝날 때까지 연결이 닫히지 않습니다. --close-on-exec는 uwsgi --help에서보고되지만 웹 문서에 포함되어 있어야합니다. – roberto

3

을 상속합니다, 당신은 통과 할 수있는 옵션이 있습니다 close_fds = Popen()이면 모든 소켓은 분기 된 프로세스에 상속되지 않습니다.

+0

오, 알아두면 좋네요. 감사! – Cameron

관련 문제