登录
首页 >  Golang >  Go问答

实现观察者模式的close(channel)函数

来源:stackoverflow

时间:2024-03-11 22:51:28 253浏览 收藏

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《实现观察者模式的close(channel)函数》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!

问题内容

除了在未按特定顺序接收“退出”信号时调用其他函数之外,我还需要按需停止 http 服务器。

在我尝试实现类似观察者模式的过程中,我发现创建通道“很方便”(quit := make(chan struct{}),比方说“主题”和然后在每个 goroutine 上的“观察者”监听该通道 <-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


解决方案


我想说你的方式足够好,但缺乏一些优雅。

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

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

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>