Concurrency 测试go通道吞吐量-所有goroutines死锁

Concurrency 测试go通道吞吐量-所有goroutines死锁,concurrency,go,deadlock,goroutine,Concurrency,Go,Deadlock,Goroutine,我做了一个小程序来测试go channel吞吐量,但它总是死锁,我非常努力,但无法理解为什么: package main import ( "fmt" "runtime" ) const CONCURRENCY = 32 const WORK_PER_WORKER = 100 const TOTAL_WORK = CONCURRENCY * WORK_PER_WORKER func work() { sum := 0 for i := 0; i < 1

我做了一个小程序来测试go channel吞吐量,但它总是死锁,我非常努力,但无法理解为什么:

package main

import (
    "fmt"
    "runtime"
)

const CONCURRENCY = 32
const WORK_PER_WORKER = 100
const TOTAL_WORK = CONCURRENCY * WORK_PER_WORKER

func work() {
    sum := 0
    for i := 0; i < 10000000; i++ {
        sum *= i
    }
}

type WorkItem struct {
    Done chan int
}

func main() {
    runtime.GOMAXPROCS(CONCURRENCY)
    var workQueue [CONCURRENCY]chan *WorkItem
    // initialize workers
    for i := 0; i < CONCURRENCY; i++ {
        workQueue[i] = make(chan *WorkItem)
    }
    // start workers
    for i := 0; i < CONCURRENCY; i++ {
        go func(i int) {
            anItem := <-workQueue[i]
            work()
            anItem.Done <- 1
        }(i)
    }
    completed := make(chan bool, TOTAL_WORK)
    for i := 0; i < TOTAL_WORK; i++ {
        go func(i int) {
            // send work to queues
            workToDo := &WorkItem{Done: make(chan int)}
            workQueue[i/WORK_PER_WORKER] <- workToDo // !! DEADLOCK
            // wait until the work is done
            <-workToDo.Done
            completed <- true
        }(i)
    }
    fmt.Println("Waiting")
    for i := 0; i < TOTAL_WORK; i++ {
        <-completed
    }
}
主程序包
进口(
“fmt”
“运行时”
)
const并发=32
每名工人的施工工作量=100
const TOTAL_WORK=并发性*每个工作人员的工作
func工作(){
总和:=0
对于i:=0;i<10000000;i++{
总和*=i
}
}
类型WorkItem结构{
成龙国际酒店
}
func main(){
runtime.GOMAXPROCS(并发)
var workQueue[CONCURRENCY]chan*WorkItem
//初始化工人
对于i:=0;ianItem:=因为您的工作人员只处理一个任务,然后退出。因此,只有先
并发
项继续,然后
工作队列[i/WORK\u PER\u worker]您的代码
go func(i int){anItem:=
for i := 0; i < CONCURRENCY; i++ {
    go func(i int) {
        for anItem := range workQueue[i] {
            work()
            anItem.Done <- 1
        }
    }(i)
}