为了账号安全,请及时绑定邮箱和手机立即绑定

golang中是否可以接受优雅的关闭写入并发模式?

golang中是否可以接受优雅的关闭写入并发模式?

Go
陪伴而非守候 2021-11-08 16:12:43
我刚刚开始在 go 中使用并发。我有其他语言并发方面的经验,并且很遗憾如果您尝试写入封闭的通道会引发恐慌。这种模式会非常有用,因为您可以解耦 actor 的生命周期并使它们独立。这使您不必同步清理它们。本质上,我可以让读者在关闭之前关闭通道,并通过通道上的写入错误通知任意数量的写入者并停止阻塞(取消)。因此,我编写了一个通用函数来处理这种形式的消息传递:/// Sends a message to a remote general channel./// Returns true if the message was sent (the send stopped blocking) or false if/// the sender closed the channel./// When the channel is unbuffered, this function returning true means that the/// sender has received the message and is acting on it.func SendRemoteCmd(ch chan interface{}, msg interface{}) bool {    defer func() {        recover()    }()    ch <- msg    return true}效果很好,就是怕golang开发者会生气,打电话告诉我,他们看了这段代码会“找到我”。语言之神之所以决定这首先应该是恐慌,可能也有一些很好的理由。如果是这种情况,您建议采用什么设计?
查看完整描述

1 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

因为发送到关闭的通道是一个程序错误,你的通道发送到可以关闭的通道必须是同步的。通常这里的正确模式是在尝试发送之前获得某种锁定,如果通道可以被第三方关闭。

这并不是特别有趣,直到您尝试在可以关闭的通道上发送,作为select涉及其他可能操作的语句的一部分。在这种情况下,一个常见的模式是将通道设置为nil如果对它们的操作不应该或不能继续。我有这样的一个非常复杂的例子connection.writeOptimizer功能在我的BT客户端在这里

请注意,在示例中仔细考虑了写入管道中涉及的资源的所有权,这是防止关闭通道等问题的好方法。writeOptimizer有效地拥有connection.writeCh, 并通过关闭它向下游发出信号,表明没有进一步的数据。它也是唯一发送到该例程的 goroutine,从而避免了必须通过其他方式将写入与关闭通道同步。


查看完整回答
反对 回复 2021-11-08
  • 1 回答
  • 0 关注
  • 202 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信