我刚刚开始在 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,从而避免了必须通过其他方式将写入与关闭通道同步。
- 1 回答
- 0 关注
- 202 浏览
添加回答
举报
0/150
提交
取消