如何安全关闭channel

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何安全关闭channel相关的知识,希望对你有一定的参考价值。

先把写的goroutine停下来就可以安全关闭channel了。 例如:
package main
import (
    "fmt"
    "sync"
)
func main() 
    var wg sync.WaitGroup
    ch := make(chan int, 1)
    send := func(m, n int) 
        for i := m; i <= n; i++ 
            ch <- i
        
        wg.Done()
    
    wg.Add(3)
    go send(1, 10)
    go send(11, 20)
    go send(21, 30)
    go func() 
        for 
            n, ok := <-ch
            if !ok 
                return
            
            fmt.Println(n)
        
    ()
    wg.Wait()
    close(ch)

用一个channel做控制就可以,写的goroutine在这个channel上收到信号就退出。

package main
import (
    "fmt"
    "sync"
    "time"
)
func main() 
    var wg sync.WaitGroup
    exit := make(chan struct)
    ch := make(chan int, 1)
    send := func(n int) 
        defer wg.Done()
        for 
            select 
            case ch <- n:
                time.Sleep(time.Second)
            case <-exit:
                return
            
        
    
    wg.Add(10)
    // 10个goroutine写
    for i := 0; i < 10; i++ 
        go send(i)      
    
    // 一个goroutine读
    go func() 
        for 
            n, ok := <-ch
            if !ok 
                return
            
            fmt.Println(n)
        
    ()
    time.Sleep(time.Second*10)
    close(exit)
    wg.Wait()
    close(ch)

参考技术A 如何安全关闭channel
1、打开控制面板 ,左键双击internet 选项; 2、在-internet 属性窗口,该区域的安全级别选择中 - 高,点击:应用 - 确定。
参考技术B 1、打开控制面板 ,左键双击internet 选项; 2、在-internet 属性窗口,该区域的安全级别选择中 - 高,点击:应用 - 确定。

如何关闭写作频道

【中文标题】如何关闭写作频道【英文标题】:how to close the Channel for Writing 【发布时间】:2011-11-22 02:13:24 【问题描述】:

我们使用的是Netty 3.2.3版本,想根据一定的计算关闭通道写入。

我们将通过以下方式关闭频道:

channel.setInterestOps(channel.getInterestOps() | Channel.OP_WRITE);

并通过以下方式重新打开它:

channel.setInterestOps(channel.getInterestOps() & Channel.OP_WRITE);

但是根据表现,有些地方是错误的。 计算和我们做 serReadable true/false 一样, 这工作正常。

【问题讨论】:

【参考方案1】:

Channel.OP_WRITE 仅供参考。 Netty 使用它来指示 I/O 线程是否可以立即将数据写入通道。如果 channel.isWritable() 为 false,则 Netty 将排队任何进一步的数据,直到它可以被通道接受。如果在 isWritable() 为 false 时继续写入数据,则最终可能会遇到 OutOfMemoryError。

我假设您并不想真正关闭频道,只需停止写入即可。正确的方法是在每次发送后检查 channel.isWritable(),或者接收 ChannelStateEvent(可能通过覆盖 SimpleChannelUpstreamHandler.channelInterestChanged())并暂停正在将数据写入通道的任何应用程序进程。

在任何一种情况下,您都希望收到 ChannelStateEvent 以了解何时可以再次开始写入通道。

【讨论】:

以上是关于如何安全关闭channel的主要内容,如果未能解决你的问题,请参考以下文章

Golang面经ChannelContextGoroutine

go语言零碎笔记

go语言零碎笔记

csharp中的grpc通道/存根线程是不是安全

[11][go] go concurrency

[11][go] go concurrency