close(channel)用于实现观察者模式

问题描述 投票:0回答:1

除了在没有特定顺序接收“退出”信号时调用其他功能,我还需要停止HTTP服务器。

在我尝试实现类似observer pattern之类的东西时,我发现“方便”创建一个频道(quit := make(chan struct{}),让我们说“主题”然后在每个goroutines“观察者”听取该频道<-quit等到当时改为继续。

我一次触发所有函数的方法是关闭通道close(quit)而不是通过写入它,我已经尝试了这个并且到目前为止工作,但想知道这种方法是否有一些缺点或者是否有更好的/惯用的实现方式类似的行为/模式。

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()
}

https://play.golang.org/p/uIfMJfN6xQy

go observer-pattern
1个回答
1
投票

我会说你的方式很好但缺乏优雅。

您可以使用sync.Cond实现所需的行为:

https://golang.org/pkg/sync/#Cond How to correctly use sync.Cond?

© www.soinside.com 2019 - 2024. All rights reserved.