相关疑难解决方法(0)

没有阅读,如何检查频道是否关闭?

这是@Jimt编写的Go中的工作者和控制器模式的一个很好的例子,回答" 是否有一些优雅的方式来暂停和恢复golang中的任何其他goroutine? "

package main

import (
    "fmt"
    "runtime"
    "sync"
    "time"
)

// Possible worker states.
const (
    Stopped = 0
    Paused  = 1
    Running = 2
)

// Maximum number of workers.
const WorkerCount = 1000

func main() {
    // Launch workers.
    var wg sync.WaitGroup
    wg.Add(WorkerCount + 1)

    workers := make([]chan int, WorkerCount)
    for i := range workers {
        workers[i] = make(chan int)

        go func(i int) {
            worker(i, workers[i])
            wg.Done()
        }(i)
    }

    // Launch controller routine.
    go func() { …
Run Code Online (Sandbox Code Playgroud)

channel go

64
推荐指数
3
解决办法
9万
查看次数

关闭未知长度的通道

当不知道它的
长度时,我无法关闭频道

package main

import (
    "fmt"
    "time"
)

func gen(ch chan int) {
    var i int
    for {
        time.Sleep(time.Millisecond * 10)
        ch <- i
        i++
        // when no more data (e.g. from db, or event stream)
        if i > 100 {
            break
        }
    }

    // hot to close it properly?
    close(ch)
}

func receiver(ch chan int) {
    for i := range ch {
        fmt.Println("received:", i)
    }
}

func main() {
    ch := make(chan int)

    for i := 0; i …
Run Code Online (Sandbox Code Playgroud)

concurrency channel go

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

标签 统计

channel ×2

go ×2

concurrency ×1