gpt4 book ai didi

multithreading - 在 Go 中,如果您写入封闭 channel 会发生什么?我可以将 channel 视为确定性 RE 销毁吗?

转载 作者:IT王子 更新时间:2023-10-29 01:18:21 25 4
gpt4 key购买 nike

好的,SO 警告我有关主观标题的问题,所以请让我解释一下。现在我正在研究 Go,我已经阅读了规范,看了一些 IO 演讲,它看起来很有趣,但我有一些问题。

我最喜欢的例子之一是这个 select 语句,它监听来自“DoAfter()”或其他东西的 channel , channel 会在从现在起的给定时间发送一些东西。

像这样的东西(这可能行不通,如果有的话,伪造!)

to := Time.DoAfter(1000 * Time.MS)
select:
case <-to:
return nil //we timed out
case d := <-waitingfor:
return d

假设我们正在等待的事情发生得非常快,所以这个函数返回并且不再监听 to,DoAfter 会发生什么?

例如,我喜欢并且知道您不应该测试该 channel

if(chanToSendTimeOutOn.isOpen()) {
chanToSendTimeOutOn<-true
}

我喜欢 channel 同步的方式,例如,上面的函数可能会在 isOpen() 测试之后但在发送 true 之前返回。我真的反对测试,这避免了 channel 所做的事情 - 隐藏锁等等。

我已经阅读了规范并看到了运行时 panic 和恢复,但在这个例子中我们在哪里恢复?等待发送超时的东西是 go 例程还是某种“对象”?我想象这个“对象”有一个在给定时间后必须发送东西的排序列表,它只是按正确的顺序将 TimeAfter 请求附加到队列并通过它。我不确定那会在哪里有机会真正恢复。

如果它生成了 go-routines,每个 go-routines 都有自己的计时器(当然由运行时管理,所以线程实际上不会阻塞时间)那么什么有机会恢复?

我的问题的另一部分是关于 channel 的生命周期,我想它们是被引用计数的,那些能够读取的是被引用计数的,所以如果任何地方都没有可读引用,它就会被销毁。我称之为确定性的。对于“点对点”拓扑,如果你坚持 Go 的“通过 channel 发送东西,不要访问它”,你可以形成它

因此,例如,当想要超时的东西返回 to channel 时,任何人都不再读取它。所以 go-routine 现在没有意义了,有没有办法让它不做任何工作就返回?

例子:

使用 defer 的文件读取 go 例程在完成后关闭文件,它是否可以“感知”它应该发送内容的 channel 已关闭,从而返回而不读取还有吗?

我还想知道为什么 select 语句是“不确定的”,如果第一个和第二个都准备好了(用于非阻塞操作),如果第一个案例优先,我会非常喜欢它 - 我不会谴责它为此,但有理由吗?这是什么实现?

最后,go-routines 是如何安排的?编译器是否每隔这么多指令添加某种“屈服”,因此运行的线程将在不同的 goroutine 之间切换?我在哪里可以找到有关较低级别内容的信息?

我知道 Go 宣称“你根本不需要担心这个”,但我想知道我写的东西实际上隐藏了什么(这可能是 C++ 的东西)以及原因。

最佳答案

如果你写入一个关闭的 channel ,你的程序将会崩溃(参见 http://play.golang.org/p/KU7MLrFQSx 例如)。你可能会 catch this error with recover ,但是处于不知道写入的 channel 是否打开的情况通常是程序中存在错误的标志。 channel 的发送端负责关闭它,因此它应该知道当前状态。如果您有多个 goroutines 在 channel 上发送,那么它们应该协调关闭 channel (例如,通过使用 sync.WaitGroup )。

在您的 Time.DoAfter 假设中,这取决于 channel 是否已缓冲。如果它是一个无缓冲的 channel ,那么写入定时器 channel 的 goroutine 将被阻塞,直到有人从 channel 中读取。如果那从未发生过,那么 goroutine 将保持阻塞状态,直到程序完成。如果 channel 被缓冲,发送将立即完成。在任何人从中读取之前, channel 可能会被垃圾收集。

标准库 time.After以这种方式运行,返回一个带有单槽缓冲区的 channel 。

关于multithreading - 在 Go 中,如果您写入封闭 channel 会发生什么?我可以将 channel 视为确定性 RE 销毁吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24096026/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com