英文:
Second Execution of func init() in GAE
问题
我有一个非常简单的代码,我的.go文件如下:
func init() {
http.HandleFunc("/", handlerMain)
log.Println("init executed")
}
func handlerMain(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "TEST")
}
还有app.yaml文件:
application: newsboard
version: 1
runtime: go
api_version: go1
handlers:
- url: /.*
script: _go_app
当首次执行时,一切都正常,控制台输出如下:
INFO 2015-10-19 19:28:56,626 devappserver2.py:763] Skipping SDK update check.
INFO 2015-10-19 19:28:56,652 api_server.py:205] Starting API server at: http://localhost:56946
INFO 2015-10-19 19:28:56,655 dispatcher.py:197] Starting module "default" running at: http://localhost:8080
INFO 2015-10-19 19:28:56,658 admin_server.py:116] Starting admin server at: http://localhost:8000
2015/10/19 19:28:59 init executed
但是当我访问http://localhost:8080时,我得到以下结果:
INFO 2015-10-19 19:32:16,394 module.py:786] default: "GET / HTTP/1.1" 200 4
2015/10/19 19:32:16 init executed
所以init()函数被执行了两次。然后,每次重新加载页面时,一切都正常,控制台不再显示"init executed"。我的问题是:为什么init()会执行两次,这样做是否正常?
英文:
I have very simple code, my .go file:
func init() {
http.HandleFunc("/", handlerMain)
log.Println("init executed")
}
func handlerMain(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "TEST")
}
and app.yaml:
application: newsboard
version: 1
runtime: go
api_version: go1
handlers:
- url: /.*
script: _go_app
When Executed at first everything goes fine, this is output from console
INFO 2015-10-19 19:28:56,626 devappserver2.py:763] Skipping SDK update check.
INFO 2015-10-19 19:28:56,652 api_server.py:205] Starting API server at: http://localhost:56946
INFO 2015-10-19 19:28:56,655 dispatcher.py:197] Starting module "default" running at: http://localhost:8080
INFO 2015-10-19 19:28:56,658 admin_server.py:116] Starting admin server at: http://localhost:8000
2015/10/19 19:28:59 init executed
But when I Enter http://localhost:8080 I get following:
INFO 2015-10-19 19:32:16,394 module.py:786] default: "GET / HTTP/1.1" 200 4
2015/10/19 19:32:16 init executed
So init() somehow is being executed twice. Then, Every time when I reload page everething is ok,"init executed" doesn't appear in console anymore.
My question: Why init() happens twice and is this okay?
答案1
得分: 2
这是完全没问题的。
Go AppEngine SDK会监视应用程序的代码库,每当检测到更改(例如修改了一个.go
源文件),它会自动重新加载应用程序。这包括卸载代码并重新加载它-再次运行init()
函数。
基本上,应用程序何时重新加载(因此执行init()
函数)的控制权在SDK的“手中”。尝试修改一个.go
文件,然后在浏览器中刷新:你会看到另一个init()
函数的执行。
当你首次启动应用程序时,所有的代码都会被加载/编译(并执行init()
函数)-这需要做以报告是否有错误。之后,SDK可能会卸载它(不确定-找不到相关文档),只有在发生请求时才会重新加载它(可能很快,也可能不会)。
英文:
It is perfectly fine.
The Go AppEngine SDK monitors the application's code base, and whenever it detects changes (e.g. you modified a .go
source file) it automatically reloads your application. This includes / involves unloading your code and reloading it - running init()
functions again.
Basically control over when an app is reloaded - and therefore execution of the init()
functions - is in the "hands" of the SDK. Try to modify a .go
file and hit refresh in the browser: you will experience another init()
function execution.
When you first start your app, all the code is loaded/compiled (and init()
functions get executed) - this needs to be done in order to report if there are errors. After that the SDK may unload it (not sure - couldn't find relevant docs) and only load it again if a request does happen (which may or may not come anytime soon).
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论