close(channel) 用于实现观察者模式
close(channel) used to implement the observer pattern
除了在接收到 "quit" 无特定顺序的信号时调用其他函数外,我还需要按需停止 HTTP 服务器。
在我尝试实现类似 observer pattern 的过程中,我发现 "handy" 可以创建一个频道(quit := make(chan struct{})
,假设“主题" 然后在每个 goroutines "observers" 上监听该频道 <-quit
等待变化然后继续。
我一次触发所有功能的方法是关闭通道 close(quit)
而不是写入它,我已经尝试过这个并且到目前为止有效,但想知道这种方法是否有一些缺点或如果有 better/idiomatic 种实现类似 behavior/pattern 的方法。
package main
import (
"log"
"net/http"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
srv := &http.Server{Addr: ":8080"}
wg.Add(1)
go func() {
log.Println(srv.ListenAndServe())
wg.Done()
}()
quit := make(chan struct{})
go func() {
<-quit
if err := srv.Close(); err != nil {
log.Printf("HTTP server Shutdown: %v", err)
}
}()
wg.Add(1)
go func() {
<-quit
log.Println("just waiting 1")
wg.Done()
}()
wg.Add(1)
go func() {
<-quit
log.Println("just waiting 2")
wg.Done()
}()
<-time.After(2 * time.Second)
close(quit)
wg.Wait()
}
我会说你的方式足够好,但缺乏一些优雅。
您可以使用 sync.Cond
实现所需的行为:
除了在接收到 "quit" 无特定顺序的信号时调用其他函数外,我还需要按需停止 HTTP 服务器。
在我尝试实现类似 observer pattern 的过程中,我发现 "handy" 可以创建一个频道(quit := make(chan struct{})
,假设“主题" 然后在每个 goroutines "observers" 上监听该频道 <-quit
等待变化然后继续。
我一次触发所有功能的方法是关闭通道 close(quit)
而不是写入它,我已经尝试过这个并且到目前为止有效,但想知道这种方法是否有一些缺点或如果有 better/idiomatic 种实现类似 behavior/pattern 的方法。
package main
import (
"log"
"net/http"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
srv := &http.Server{Addr: ":8080"}
wg.Add(1)
go func() {
log.Println(srv.ListenAndServe())
wg.Done()
}()
quit := make(chan struct{})
go func() {
<-quit
if err := srv.Close(); err != nil {
log.Printf("HTTP server Shutdown: %v", err)
}
}()
wg.Add(1)
go func() {
<-quit
log.Println("just waiting 1")
wg.Done()
}()
wg.Add(1)
go func() {
<-quit
log.Println("just waiting 2")
wg.Done()
}()
<-time.After(2 * time.Second)
close(quit)
wg.Wait()
}
我会说你的方式足够好,但缺乏一些优雅。
您可以使用 sync.Cond
实现所需的行为: