如何从生产者角度检查go channel 是否已经关闭了

162 views
Skip to first unread message

郎梓成

unread,
Oct 10, 2019, 10:36:32 PM10/10/19
to Golang-China
生产者一般来说是主动关闭go channel 的。
消费者可以通过 <- chan 是否为nil的方式判断chan是否关闭
那么生产者有什么优雅的方式可以判断吗?

杜沁园

unread,
Oct 14, 2019, 2:45:35 AM10/14/19
to Golang-China
_, ok = <- chan
if ok {

} else {

}

生产者和消费者应该都可以通过这种方式判断吧

在 2019年10月11日星期五 UTC+8上午10:36:32,郎梓成写道:

veners chang

unread,
Oct 15, 2019, 9:17:32 AM10/15/19
to golang...@googlegroups.com
生产者目前没有一种非侵入式的方法判断chan是否关闭,而且继续向已关闭的chan发送数据会导致panic。
所以我建议重新思考自己的设计是否合理,或者使用某个中介手段例如context通知生产者chan被关闭。

杜沁园 <sa51...@mail.ustc.edu.cn> 於 2019年10月14日 週一 下午3:45寫道:
--
--
官网: http://golang-china.org/
IRC: irc.freenode.net #golang-china
@golangchina
---
您收到此邮件是因为您订阅了Google网上论坛上的“Golang-China”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到golang-china...@googlegroups.com
要在网络上查看此讨论,请访问https://groups.google.com/d/msgid/golang-china/8f67fc38-611d-483b-9972-f3e0e9ca94d6%40googlegroups.com

Ric Y

unread,
Oct 16, 2019, 3:42:18 AM10/16/19
to golang...@googlegroups.com
一般来说,在一个异步服务调用中,需要等待调用结束,在关闭channel。
你可以通过简单的WaitGroup来实现。
 
例如如下是influx-relay在进行高效代理每个请求到后端的代码逻辑,简单可靠高效,值得学习:

        var wg sync.WaitGroup
        wg.Add(len(h.backends))

        var responses = make(chan *responseData, len(h.backends))

        for _, b := range h.backends {
                b := b
                go func() {
                        defer wg.Done()
                        /* do somthing */
                        responses <- resp
                }()
        }

        go func() {
                wg.Wait()
                close(responses)
                putBuf(outBuf)
        }()

        for resp := range responses {
                /* do somthing */
        }

veners chang <sev...@gmail.com> 于2019年10月15日周二 下午9:17写道:

郎梓成

unread,
Oct 16, 2019, 4:30:25 PM10/16/19
to Golang-China
是的,一般要避免从生产者关闭chan的行为,我的意思是,想知道能否不读取数据而简单判断chan的状态,比如c++中的写法:if(nullptr!= fakeChan) 或者提供一种原声方法比如 if fakeChan.isClose()这种。
现在看起来好像没有很好的方法。
Reply all
Reply to author
Forward
0 new messages