繁体   English   中英

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

[英]Testing go channel throughput - all goroutines deadlock

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

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

你的代码go func(i int) { anItem := <-workQueue[i]; ... } go func(i int) { anItem := <-workQueue[i]; ... }workQueue[i]删除workQueue[i] 1项,但是您正在尝试将WORK_PER_WORKER项填充到其中。 您将处理CONCURRENCY许多项目,然后所有读取goroutines已终止并且您遇到了僵局。

循环工作者goroutines“解决”你的僵局: http//play.golang.org/p/j2pavqnBDv只是“解决”因为这些工作者goroutines永远不会终止。 也许您可以尝试close您的频道,以便在没有任何内容发送时通知工作人员goroutines。

因为您的工作人员只处理一个任务然后退出。 因此,只有第一个CONCURRENCY项目继续进行,然后workQueue[i/WORK_PER_WORKER] <- workToDo阻塞。 因此, completed陈永远不会收到足够的值, main也永远阻止。

你的工作者应该在循环中工作,如下所示:

for i := 0; i < CONCURRENCY; i++ {
    go func(i int) {
        for anItem := range workQueue[i] {
            work()
            anItem.Done <- 1
        }
    }(i)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM