gpt4 book ai didi

go - 理解代码 : Sharing resources by communicating

转载 作者:数据小太阳 更新时间:2023-10-29 03:29:55 25 4
gpt4 key购买 nike

我一直在努力理解中的代码 https://golang.org/doc/codewalk/sharemem/虽然我了解了大部分关于通过 channel 传递资源的部分,但我无法理解程序运行的无限循环。当轮询函数中的“输入” channel (从主函数接收)时,程序如何无限执行轮询函数) 只运行 3 个 poller go 例程?

我得到了 StateMonitor 的想法,它具有无限循环的匿名 go 函数。但它无法在不从 Poller 函数接收的情况下更新 LogState。我假设程序无限地对 url 执行 Get 请求。

为了确认我所理解的没有错,我通过打开和关闭 wifi 来测试程序以查看日志是否发生变化。令我惊讶的是,它确实如此,进行了几次迭代,但之后它停止响应我的更改并继续显示相同的日志。那么,这是否意味着程序有问题?还是我没有理解一些基本概念?

最佳答案

How does the program execute Poller function infinitely when the "in" channel in poller function(that receives from main function) run only 3 poller go routines ?

因此,程序首先创建两个轮询器:

for i := 0; i < numPollers; i++ {
go Poller(pending, complete, status)
}

然后它将三个资源发送到 pending:

for _, url := range urls {
pending <- &Resource{url: url}
}

每个 Poller 从 pending 中读取并轮询资源:

for r := range in {
s := r.Poll()
status <- State{r.url, s}
out <- r
}

这段代码似乎可以无限执行,但通常会阻塞从队列中读取。所以这个循环等待下一个值出现。

让我们虚拟地跨过它:

  1. 有两个 Pollers 阅读资源。
  2. 程序将第一个资源发送到队列。
  3. 其中一个轮询器获取资源并开始池化。另一个等待。
  4. 程序会在某个时刻向队列发送新资源。
  5. 由于第一个轮询器忙,第二个轮询器被解除阻塞并开始轮询。
  6. 程序发送第三个资源并在两个轮询器忙时阻塞。
  7. 当其中一个轮询器完成时,它会占用最后一个资源并继续。
  8. 同时,主程序从完整队列中读取值。

for r := range in { s := r.Poll() status <- State{r.url, s} out <- r } How does this code run infinitely? If it loops over "in" channel, and "in" gets its resources from pending queue, it should terminate after few iterations. I think this is exactly the part that I don't understand.

准确地说,in没有从 pending 获取资源队列。 in pending队列。可以通过调用 close 关闭队列(或 channel ,我可以互换使用)但直到它没有明确关闭它才被认为是活着的。从它读取的任何内容都会阻塞当前的 goroutine,直到给出下一个值。然后 gorotine 恢复。

我想您一直在考虑 channel ,就像它们是具有固定数量元素的数组一样。他们不是。考虑他们喜欢具有无限数量元素的数组,但阻塞读取可能会抛出异常(如果您不熟悉这个概念,这就是关闭队列的粗略近似)。

关于go - 理解代码 : Sharing resources by communicating,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31876138/

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