func taskScheduler(totalTasks int, taskQueue chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    for i:=0; i < totalTasks; i++ {
        fmt.Println("Scheduler is adding task to queue: ", i)
        taskQueue <- i
    }
    close(taskQueue)
}

func taskWorker(taskQueue chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    for value := range taskQueue {
        fmt.Println("Working on task: ", value)
    }
}

func main() {
    var wg sync.WaitGroup
    taskQueue := make(chan int, 5)
    wg.Add(2)
    go taskScheduler(10, taskQueue, &wg)
    go taskWorker(taskQueue, &wg)
    wg.Wait()
}

Results from Console:
Scheduler is adding task to queue:  0
Scheduler is adding task to queue:  1
Scheduler is adding task to queue:  2
Scheduler is adding task to queue:  3
Scheduler is adding task to queue:  4
Scheduler is adding task to queue:  5
Scheduler is adding task to queue:  6
Working on task:  0
Working on task:  1
Working on task:  2
Working on task:  3
Working on task:  4
Working on task:  5
Working on task:  6
Scheduler is adding task to queue:  7
Scheduler is adding task to queue:  8
Scheduler is adding task to queue:  9
Working on task:  7
Working on task:  8
Working on task:  9

我本以为会看到两件事,但最终没有发生:

  1. 由于缓冲区已满,调度程序的第一轮已在任务4停止

  2. 在任务4停止后,Worker将处理任务0,然后调度器将调度任务5,依此类推.

What is causing each goroutine to process 7 tasks at a time?
What is causing each goroutine to "take turns" performing their tasks. In other examples I see, once a channel is full, as data is being read from the channel, data is then added. Usually one at a time.

提前谢谢!

推荐答案

此输出建议发生以下事件的顺序:

  • 0-4的taskScheduler个循环,将任务发送到通道
  • 在此过程中,taskWorker接收其中一个任务
  • taskWorker可以打印之前,taskScheduler再发送一个任务(5),然后打印它是调度6,并阻止.
  • taskWorker从通道读取,并打印0-5
  • 由于通道不可写,因此任务调度器发送6
  • taskWorker张照片6

...诸如此类

Go相关问答推荐

是不是有什么原因导致`Strings.EqualFold`不先进行长度比较?

如何在围棋中从多部分.Part中获取多部分.文件而不保存到磁盘?

Golang String

从文件读取字节,将其保存到 struct 体并修改值

如何使用 html/template 在 golang 中运行一个范围内的范围

启动套接字服务器会干扰 gRPC/http 客户端服务器通信 Golang

Golang text/template中的startswith函数 - 入门教程

如何忽略打印达到最大深度限制 go colly

如何将已知类型转换为指向switch 中类型参数的指针?

Golang prometheus:有没有办法衡量出站请求的指标?

使用图像解码 JPEG 时 colored颜色 不正确.解码并写入 PDF?

go version -m 输出中的箭头符号=>是什么意思?

io.Pipe 使用困难

为什么我不能使用来自 gocloak 中 Login() 的访问令牌在 KeyCloak 中创建新客户端?

K8s 算子读取原始数据

Unescape 在 rss 中两次逃脱了标题

如何在 Gorm 中获得特定日期的最大值?

即使没有竞争条件也没有得到任何输出

Go 泛型是否与 LINQ to Objects 等效?

为什么在 unsafe.Sizeof() 中取消引用 nil 指针不会导致panic ?