如何安全关闭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 mainimport (
"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的主要内容,如果未能解决你的问题,请参考以下文章