私は1000人のワーカーのワーキングプールを作成してチャネルで遊んでいます。現在、私は次のエラーを取得しています:ワーキングプールのチャネルのデッドロック
ここfatal error: all goroutines are asleep - deadlock!
私のコードです:
package main
import "fmt"
import "time"
func worker(id int, jobs <-chan int, results chan<- int) {
for j := range jobs {
fmt.Println("worker", id, "started job", j)
time.Sleep(time.Second)
fmt.Println("worker", id, "finished job", j)
results <- j * 2
}
}
func main() {
jobs := make(chan int, 100)
results := make(chan int, 100)
for w := 1; w <= 1000; w++ {
go worker(w, jobs, results)
}
for j := 1; j < 1000000; j++ {
jobs <- j
}
close(jobs)
fmt.Println("==========CLOSED==============")
for i:=0;i<len(results);i++ {
<-results
}
}
ですが、なぜでしょうか?私はまだ新しいです、そして、私はこれを理解することを望んでいます。
をバッファー? – rhillhouse
チャネル・サイズを指定しないと、バッファ・サイズが0になります。つまり、チャネルへの書き込みは、リーダが使用可能になるまでブロックされます。無制限のサイズのチャネルを設計で作成することはできません(これは、たとえばサーバーでの制約のないメモリ使用につながる可能性があるためです)。 – Thomas