问题源于:我已经在后台做了多少工作,何时已经发送了回复。例如:我只想接收数据,告诉客户“确定”,然后继续进行一些可能需要一些时间的数据库操作。
package main
import (
"fmt"
"context"
"github.com/aws/aws-lambda-go/lambda"
)
type MyEvent struct {
Name string `json:"name"`
}
func HandleRequest(ctx context.Context, name MyEvent) (string, error) {
go RecordQuery(name)
return fmt.Sprintf("Hello %s!", name.Name ), nil
}
func RecordQuery(name MyEvent) {
// insert stuff in the database, mark user active,
// log activity, etc..
}
func main() {
lambda.Start(HandleRequest)
}
我们可以指望goroutine能够完成它的工作吗?
答案 0 :(得分:2)
事实证明我们不能假设代码会运行。
示例实施:
var alreadyLogging bool
func RecordQuery(name MyEvent) {
if alreadyLogging {
return
}
alreadyLogging = true
for i := 0; ; i++ {
time.Sleep(time.Second)
log.Print("Still here ", i)
}
}
行为:只要运行lambda的容器正在接收请求,就会执行goroutine。但是当容器不再接收请求时,所有代码都将停止。
可能的输出(在cloudwatch中):
2018/05/16 08:50:46 Still here 70
2018/05/16 08:50:47 Still here 71
2018/05/16 08:50:48 Still here 72
2018/05/16 08:50:49 Still here 73
2018/05/16 08:51:36 Still here 74
2018/05/16 08:51:37 Still here 75
2018/05/16 08:51:38 Still here 76
请注意,在Node.js编程模型中,即使事件循环中存在事件,您也可以请求AWS Lambda在调用回调后立即冻结该过程:The Context Object Properties。
查看此API的一些用例会很有趣。
更新:在Node.js中,一旦连接到数据库,您就会有一个非空的事件队列。这就是为什么这个设置可用的原因。