如何异步发送电子邮件?

时间:2021-05-17 04:41:23

标签: go asynchronous

我有一个服务请求的端点。在请求流中,端点需要生成并发送电子邮件通知(让我们将代码命名为 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 新手,希望确保我遵循最佳实践。

1 个答案:

答案 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
}