Python 是否每个包含处理程序的脚本都需要main()呢?
有经验的Java程序员尝试学习Python。我在Google App Engine上有一个应用程序,希望将我的管理员处理程序移动到一个单独的文件中。现在我有main.py和admin.py。我已设置app.yaml以正确路由流量,并在每个文件中添加了对WSGIApplication()的调用,以路由到相应的处理程序 我的问题是每个脚本文件是否需要def main()和相应的if语句:Python 是否每个包含处理程序的脚本都需要main()呢?,python,google-app-engine,httphandler,Python,Google App Engine,Httphandler,有经验的Java程序员尝试学习Python。我在Google App Engine上有一个应用程序,希望将我的管理员处理程序移动到一个单独的文件中。现在我有main.py和admin.py。我已设置app.yaml以正确路由流量,并在每个文件中添加了对WSGIApplication()的调用,以路由到相应的处理程序 我的问题是每个脚本文件是否需要def main()和相应的if语句: application = webapp.WSGIApplication([(r'/admin/(.*)', A
application = webapp.WSGIApplication([(r'/admin/(.*)', Admin)],
debug=True)
def main():
run_wsgi_app(application)
if __name__ == '__main__':
main()
没有必要:您可以:
if __name__ == '__main__':
run_wsgi_app(application)
我似乎记得读过一篇文章,谷歌推荐使用
main()
函数,因为他们以字节编译的形式缓存它,而不是在每次收到请求时重新编译文件。尽管这对管理员来说可能没有多大区别。在任何直接引用您的app.yaml的脚本中,您都需要它
每当App Engine需要向您的脚本之一发送请求时,它都会执行以下步骤:
脚本以前导入过吗?如果没有,只需导入它并停止
如果以前导入过脚本,它是否具有名为main
的函数?如果没有,请再次导入并停止
执行脚本的main
功能
之所以这样做是因为导入模块相对比较昂贵,并且没有必要为每个请求重新导入模块。因此,它提供了一个优化:如果您提供一个名为main
的函数,在第一个请求之后,它将只执行该函数,而不是重新导入脚本。if\uuuuu name\uuuu==“\uuuuu main\uuuuu”:
节用于检测脚本的第一次导入,并手动执行该第一个请求的main
简言之,答案是您可以同时保留main
和if
子句,或者同时包含它们。如果不使用它们,您的应用程序的效率会稍低,但只有在包含其中一个而不是另一个的情况下,您才会遇到问题。没有任何东西可以阻止您在app.yaml中根据路径在不同权限级别列出同一脚本文件两次。要稍微重新措辞,不需要使用main()
方法,但是需要一个如果uuu name\uuuu=='\uuuu main\uuuu'
块。@Luke:这取决于谷歌的设置。if\uuuu name\uuuuu
技巧检查您是在导入还是在运行它,我不知道谷歌到底在做什么。但我绝对建议你把它放在适当的位置,这很有道理。我是Python新手。以下是尼克·约翰逊在他的博客上写的:“不是为每个请求重新执行Python可执行文件,而是为多个请求使用单个Python运行时。每个请求只需重新导入应用程序的主处理程序脚本,这将导致重新执行其中的所有代码,尽管从中加载的模块不会重新导入。作为进一步的优化,如果在处理程序模块中提供一个名为“main”的函数,则该函数将在第二次和后续请求中执行,而不是重新导入模块。“谢谢你的详细回答,尼克。我的问题是针对实现RequestHandler的脚本的。但是你是说,任何加载的脚本都应该包含这个习惯用法,以便使导入更有效-正确吗?@任何从app.yaml
引用的脚本。您不需要将它放在包含RequestHandler但不直接执行的脚本中,也不需要放在任何其他脚本中,而不是直接在app.yaml
中列出的脚本中。