【发布时间】:2016-06-05 01:44:32
【问题描述】:
我对在 goroutine 中使用 SMTP 时发现的一些奇怪行为感到困惑。
当尝试使用以下代码发送电子邮件时,我的 SendMail 功能启动(我可以看到一条日志消息)但从未完成。它只是挂起。
func main() {
go SendEmail("TEST")
for {}
}
但是,当我向 SendMail 添加另一个呼叫时 - 两封电子邮件都已成功发送。
func main() {
go SendEmail("TEST")
SendEmail("TEST")
for {}
}
谁能解释一下是怎么回事?
注意,这是一个非常简化的计划任务版本,因此是 while 循环
发送电子邮件的代码:
func SendEmail(message string) {
log.Print("Sending email")
from, password, to := "me@gmail.com", "PASSWORD", "me@gmail.com"
err := smtp.SendMail(
"smtp.gmail.com:587",
smtp.PlainAuth("", from, password, "smtp.gmail.com"),
from,
[]string{to},
[]byte(message),
)
if err != nil {
log.Fatal(err)
}
log.Print("Sending complete")
}
谢谢!
【问题讨论】:
-
如果将
runtime.Gosched()添加到空的for循环中会发生什么? -
尝试将
for {}替换为select {}。这可能是调度程序问题,我相信其他人会更详细地解释:)
标签: go concurrency