【问题标题】:Checking channel length becomes unresponsive in `for{ len(c) }`在“for{ len(c) }”中检查通道长度变得无响应
【发布时间】:2018-08-03 00:26:10
【问题描述】:

以下程序从不打印“Full”。取消注释fmt.Println(len(choke)),当频道已满时程序输出“Full”。

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")
        }
    }
}

@tim-heckman 在OP 中解释了这种行为的原因。

如何在不使用热循环的情况下检测通道已满?

【问题讨论】:

标签: go channel


【解决方案1】:

在写入端使用select 语句。如果有可用缓冲区或接收器等待,它将写入通道;如果通道已满,它将落入default 的情况。

func main() {
    choke := make(chan string, 150000)
    var i int
    for {
        select {
        case choke <- string(i):
            i++
        default:
            fmt.Println("Full")
            return
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 2018-10-03
    相关资源
    最近更新 更多