2015-02-04 6 views
1

나는 django와 mod_wsgi를 사용하여 아파치를 실행 중이다.mod_wsgi와 django로 Apache를 하나의 프로세스에서만 실행하는 방법은 무엇입니까?

변경시 코드를 다시로드하기 위해 두 번째 프로세스가 변경 리스너이지만, ready() 클래스의 AppConfig 클래스의 함수가 두 번 실행되고 있음을 읽었습니다. 이 함수는 한 번만 실행해야합니다.

--noreload 플래그로 django runserver를 실행하면 개발 모드에서 문제가 해결되지만 내 아파치 웹 서버의 프로덕션 모드에서이 문제에 대한 해결책을 찾을 수 없다는 것을 이해했습니다.

  1. 내가 생산에 하나의 프로세스 만 실행 또는 적어도 수있는 방법을 하나의 프로세스 만이 ready() 기능을 실행

    나는이 개 질문이?

  2. ready() 기능을 게으른 모드로 실행하지 않을 수 있습니까? 이것에 의해, 나는 첫 번째 요청이 아니라 서버 시작시에만 실행된다는 것을 의미한다. 다음과 같이 자세한 설명은

, 나는 시나리오를 경험하고있다 : ready() 기능은 pyinotify 같은 폴더 리스너를 만듭니다. 해당 수신기는 내 서버의 폴더에서 수신 대기하고 모든 변경 사항에 대한 작업을 대기열에 넣습니다. 이 청취자가 모니터되는 디렉토리의 단일 파일에 대한 모든 변경 사항에 대해 두 번 실행되는 것을보고 있습니다. 이것은 두 프로세스 모두 내 청취자를 실행하고 있다고 믿게합니다.

답변

0

프로덕션 환경에서 특히 유용하기 때문에 여러 프로세스를 생성하지 않도록해야합니다. django와 분리 된 몇 가지 외부 도구를 사용하거나 폴더 청취가 이미 실행 중인지 확인 (예 : PID 파일의 지속성 및 내용 유지)을 추가해야합니다.

+0

고마워요 (Daniel Roseman과 GwynBleidD), –

+0

이것이 제가 한 일입니다. AppConfig를 실행하여 다중 프로세스를 지원하도록 수정했지만, 서버 시작시 한 번만 코드를 실행할 수있는 방법이 없다는 것이 너무 당황 스럽습니다. 모든 종류의 패치를 사용해야 만합니다. –

+0

gunicorn 또는 uWSGI 배포에는 항상 일회성 시작 코드를 실행하는 데 사용할 수있는 시작 스크립트가 있습니다. mod_wsgi에는 wsgi 프로세스를 생성하는 데 아파치가 필요하기 때문에 그러한 가능성은 없습니다. 또한 설계 상 마스터 django 스레드가 없기 때문에 각 작업자는 서로가 아닌 데이터베이스 서버에만 의존합니다. 이것은 항상 청취자가 pid 파일에 의해 실행되고 있지 않은지를 확인하는 좋은 해결책입니다. 그래서 항상 한 번만 실행되는지 확인할 수 있습니다. – GwynBleidD

2

아니요, 두 번째 프로세스는 onchange 리스너가 아닙니다. 어디에서 읽었는지 모르겠습니다. mod_wsgi가 아니라 dev 서버에서 발생합니다.

Apache가 여러 프로세스를 처리하지 못하도록하지 마십시오. 이렇게하면 사이트 속도가 크게 줄어들 수 있습니다. 한 번에 하나의 요청 만 처리 할 수 ​​있으며 첫 번째 완료까지 다른 요청을 대기시킬 수 있습니다. 그것은 장난감 사이트 이외의 다른 것에는 좋지 않습니다.

대신 AppConfig를 수정해야합니다. 리스너를 맹목적으로 스폰하는 대신 새 리스너를 시작하기 전에 리스너가 이미 만들어 졌는지 확인해야합니다.