繁体   English   中英

当处理程序函数退出时,aws-lambda中的goroutines会发生什么?

[英]What happens with goroutines in aws-lambda when your handler function exits?

问题起源于:我已经在后台做了多少工作,何时已经发送了响应。 例如:我只想接收数据,告诉客户'确定',然后继续进行一些可能需要一些时间的数据库操作。

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来完成它的工作吗?

事实证明我们不能假设代码会运行。

示例实现:

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在调用回调后立即冻结进程: 上下文对象属性

看一下这个API的一些用例会很有趣。

更新:在Node.js中,一旦连接到数据库,就会有一个非空的事件队列。 这就是为什么这个设置可用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM