2011-02-05 4 views
2

경험 많은 파이썬을 배우려는 자바 프로그래머. Google App Engine에 applicaiton이 있고 내 관리 핸들러를 별도의 파일로 이동하려고합니다. 이제는 main.py와 admin.py가 있습니다. app.yaml을 설정하여 트래픽을 올바르게 라우팅하고 각 파일의 WSGIApplication()에 대한 호출을 추가하여 적절한 Handler로 라우트했습니다.main()은 핸들러를 포함하는 모든 스크립트에 있어야합니까?

내 질문 각 스크립트 파일 데프 주요 필요()와 문이 경우에 해당하지 않습니다 : 그것은 필요는 없습니다

application = webapp.WSGIApplication([(r'/admin/(.*)', Admin)], 
             debug=True) 

def main(): 
    run_wsgi_app(application) 

if __name__ == '__main__': 
    main() 
+1

path를 기반으로하는 다양한 권한 수준에 대해 동일한 스크립트 파일을 app.yaml에 두 번 나열하지 못하게하는 방법은 없습니다. – Matt

답변

4

app.yaml으로 직접 참조되는 스크립트에서이 값이 필요합니다.

앱 엔진은 스크립트 중 하나에 요청을 보낼 필요가 때마다, 그것은 다음과 같이 진행됩니다

  1. 스크립트가 이전에 수입되어 있습니까? 그렇지 않다면 가져오고 중지하십시오.
  2. 이전에 스크립트를 가져온 경우 main이라는 함수가 있습니까? 그렇지 않은 경우 다시 가져 와서 중지하십시오.
  3. 스크립트의 main 기능을 실행하십시오.

모듈을 가져 오는 것이 상대적으로 비용이 많이 들며 매 요청마다 다시 가져 오기가 필요하지 않기 때문입니다. 따라서 최적화를 제공합니다. main이라는 함수를 제공하면 첫 번째 요청 이후의 요청에서 스크립트를 다시 가져 오는 대신이 함수를 간단히 실행합니다. if __name__ == "__main__": 스탠자는 스크립트의 첫 번째 가져 오기를 감지하고 첫 번째 요청에 대해 수동으로 main을 실행합니다.

간단히 말해서 대답은 mainif을 둘 다 남겨 두거나 둘 다 포함 할 수 있다는 것입니다. 당신이 그들을 내버려두면, 당신의 애플 리케이션은 약간 덜 효율적이지만, 당신은 두 가지 중 하나를 포함하지만 다른 하나를 포함하면 문제가 생길 것입니다.

+0

상세한 답변을 주셔서 감사합니다. Nick. –

+0

제 질문은 RequestHandlers를 구현 한 스크립트에만 해당됩니다.하지만로드 된 스크립트에는 수입을보다 효율적으로 만들기 위해이 관용구가 포함되어야한다고 말하는 것입니다. 맞습니까? –

+0

@Will'app.yaml'에서 참조되는 모든 스크립트. RequestHandler를 포함하지만 직접 실행되지 않는 스크립트 나'app.yaml'에 직접 나열된 스크립트가 아닌 다른 스크립트에 넣을 필요는 없습니다. –

3

: 당신은 할 수 :

if __name__ == '__main__': 
    run_wsgi_app(application) 

내가 독서를 기억하는 것 요청이 들어올 때마다 파일을 다시 컴파일하지 않고 바이트 컴파일 형식으로 캐시하기 때문에 main() 기능을 사용하는 것이 좋습니다.하지만 관리 작업에 별다른 차이가 없을 수도 있습니다.

+0

약간 바꾸어 말하면'main()'메소드는 필요 없지만'if __name__ == '__main __''블록 *이 필요합니다. –

+0

@ 루크 : Google의 설정에 달려 있습니다. 'if __name__'트릭은 가져 오기 또는 실행 여부를 확인하며 Google이하는 일을 정확히 모릅니다. 그러나 나는 그것을 제자리에 가지고있는 것이 좋습니다. –

+1

좋은 지적. 저는 Python newb입니다. Nick Johnson이 블로그에서 쓴 내용은 다음과 같습니다. "각 요청에 대해 Python 실행 파일을 다시 실행하는 대신 하나의 Python 런타임이 여러 요청에 사용됩니다. 각 요청은 단순히 앱의 기본 처리기 스크립트를 다시 가져와 결과 그것으로부터로드 된 모듈은 다시 임포트되지 않지만, 그 안에있는 모든 코드를 재실행합니다. 추가 최적화로서, 핸들러 모듈에 'main'이라는 함수를 제공하면, 그 함수는 두 번째 및 후속 요청에서 실행됩니다 모듈을 다시 가져 오는 대신. " –

관련 문제