在GAE中第二次执行func init()

时间:2015-10-19 19:40:33

标签: google-app-engine go

我的代码非常简单,我的.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()不知何故被执行了两次。然后,每次当我重新加载页面时,everething都没问题,“init execution”不再出现在控制台中。 我的问题:为什么init()会发生两次,这没关系吗?

1 个答案:

答案 0 :(得分:2)

完全没问题。

Go AppEngine SDK监控应用程序的代码库,每当它检测到更改时(例如,您修改了.go源文件),它会自动重新加载您的应用程序。这包括/涉及卸载代码并重新加载 - 再次运行init()函数。

基本上控制何时重新加载应用程序 - 因此执行init()功能 - 都在SDK的“手中”。尝试修改.go文件并在浏览器中点击刷新:您将遇到另一个init()函数执行。

当您第一次启动应用程序时,所有代码都被加载/编译(并且init()函数被执行) - 这需要完成以报告是否存在错误。之后,SDK可能会卸载它(不确定 - 无法找到相关文档),只有在请求确实发生时才会再次加载(可能很快也可能不会发生)。