小编Dav*_*vic的帖子

获取大缓冲通道块的len用于循环

我遇到了一个奇怪的行为.我正在使用缓冲通道,当使用大缓冲区时,整个程序执行将会阻塞.在以下代码段中:

package main

import (
    "fmt"
)

func main() {
    choke := make(chan string, 150000)

    go func() {
        for i := 0; i < 10000000; i++ {
            choke <- string(i)
            fmt.Println("i=", i)
        }
    }()

    for {
        //fmt.Println(len(choke))
        if len(choke) >= 150000 {
            fmt.Println("Full")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的程序在大约96000次迭代时阻止,并且永远不会达到"完全"打印,除非我len(choke)在评估它之前打印出来.这可能是由于提供的延迟fmt.Println,因为问题也可以通过添加一个小的"固定" time.Sleep.

有人可以解释这种行为的原因吗?

concurrency go channels

2
推荐指数
1
解决办法
437
查看次数

标签 统计

channels ×1

concurrency ×1

go ×1