我有一个服务请求的端点。在请求流中,端点需要生成并发送电子邮件通知(让我们将代码命名为 sendEmail()
)。我希望端点异步调用 sendEmail()
。端点不应等待 sendEmail()
。
代码如下:
func (s *server) MyEndpoint(ctx context.Context, request *MyRequest) (MyResponse, error) {
// other logic
// async
sendEmail()
// end async
// other logic - should not wait for the response from sendEmail
return getMyResponse(), nil
}
我该怎么做?我意识到这可能是基本的,但我是 Go 新手,希望确保我遵循最佳实践。
答案 0 :(得分:0)
使用 go routines
执行并发代码。在您的示例中,您希望在返回时获取响应。一种方法是使用频道。
您可以通过将通道传递给两个函数来实现,其中一个生成数据,另一个使用它。有一篇关于频道 here 的精彩文章。它看起来像这样(注意我在这里使用了 interface{} 类型,如果你有一个具体的类型,这是最好的方式)
func (s *server) MyEndpoint(ctx context.Context, request *MyRequest) (MyResponse, error) {
// other logic
// async
c := make(chan interface{})
go sendEmail(c)
// end async
// other logic - should not wait for the response from sendEmail
// getMyResponse must happen only after sendEmail has done
return getMyResponse(c), nil
}