문제

내가 만든 작은 프로그램를 벤치마크 갈 channel throughput,그러나 그것은 항상 교착 상태가 매우 열심히 노력하지만 이해할 수 없는 이유:

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]; ... } 제 juste1 항에서 workQueue[i] 하지만 당신은 노력하고 물건 WORK_PER_WORKER 항목입니다.당신은에서 작동합니다 동시에 많은 항목하고 그 후 모든 읽 goroutines 이 종료되고 당신은 당신의 교착 상태가 발생합니다.

반복 노동자에 goroutines"를 해결하"당신의 교착 상태: http://play.golang.org/p/j2pavqnBDv 그냥"를 해결"이기 때문에 작업자 goroutines 지 않 종료됩니다.어쩌면 당신은 실험 closeing 채널을 알리는 작업자 goroutines 때 아무것도 보내질 것입니다.

다른 팁

작업자가 한 작업 만 처리 한 다음 종료하기 때문입니다.따라서, 제 1 발전기 아이템 만 진행 한 다음, CONCURRENCY 블록이 무한하게 블록된다.따라서 workQueue[i/WORK_PER_WORKER] <- workToDo Chan은 충분한 값과 completed도 영원히 차단합니다.

작업자는 다음과 같이 루프에서 일해야합니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top