当我运行下面的程序时,出现错误
davecheney tweets about golang
beertocode does not tweet about golang
ironzeb tweets about golang
beertocode tweets about golang
vampirewalk666 tweets about golang
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [semacquire]:
sync.runtime_Semacquire(0xc000010260?)
/usr/local/go/src/runtime/sema.go:56 +0x25
sync.(*WaitGroup).Wait(0x100c000058058?)
/usr/local/go/src/sync/waitgroup.go:136 +0x52
main.main()
/home/joe/go/src/github.com/go-concurrency-exercises/1-producer-consumer/main.go:53 +0x14f
死锁从何而来,如何改进程序以避免死锁?
package main
import (
"fmt"
"sync"
"time"
)
func producer(stream Stream, tweetChan chan *Tweet) {
for {
tweet, err := stream.Next()
if err == ErrEOF {
close(tweetChan)
return
}
tweetChan <- tweet
//tweets = append(tweets, tweet)
}
}
func consumer(tweetChan chan *Tweet) {
for t := range tweetChan {
if t.IsTalkingAboutGo() {
fmt.Println(t.Username, "\ttweets about golang")
} else {
fmt.Println(t.Username, "\tdoes not tweet about golang")
}
}
}
func main() {
start := time.Now()
stream := GetMockStream()
var wg sync.WaitGroup
tweetChan := make(chan *Tweet)
// Producer
//tweets := producer(stream)
wg.Add(2)
go producer(stream, tweetChan)
// Consumer
//consumer(tweets)
go consumer(tweetChan)
wg.Wait()
fmt.Printf("Process took %s\n", time.Since(start))
}
如果需要看mockstream.go,参考 https://github.com/loong/go-concurrency-exercises/tree/master/1-producer-consumer
我的程序是原程序修改main.go的并发版本
墨色风雨
相关分类