
代码:https://github.com/NIGHTFIGHTING/go_learning/tree/master/src/channel/done
package main
import (
"fmt"
//"time"
)
func doWorker(id int, c chan int, done chan bool) {
for n := range c {
fmt.Printf("Worker %d received %c\n",
id, n)
go func() { done <- true }()
}
}
type worker struct {
in chan int
done chan bool
}
// <- chan
// chan <-
func createWorker(id int) worker {
w := worker {
in: make(chan int),
done: make(chan bool),
}
go doWorker(id, w.in, w.done)
return w
}
func chanDemo() {
var workers [10]worker
for i := 0; i < 10; i++ {
workers[i] = createWorker(i)
}
// for i := 0; i < 10; i++ {
// workers[i].in <- 'a' + i
// <- workers[i].done
// }
// for i := 0; i < 10; i++ {
// workers[i].in <- 'A' + i
// <- workers[i].done
// }
for i, worker := range workers {
worker.in <- 'a' + i
}
for i, worker := range workers {
worker.in <- 'A' + i
}
// wait for all of them
for _, worker := range workers {
<-worker.done
<-worker.done
}
}
func main() {
chanDemo()
}
package main
import (
"fmt"
"sync"
)
func doWorker(id int, w worker) {
for n := range w.in {
fmt.Printf("Worker %d received %c\n",
id, n)
w.done()
}
}
type worker struct {
in chan int
done func()
}
func createWorker(id int, wg *sync.WaitGroup) worker {
w := worker {
in: make(chan int),
done: func() {
wg.Done()
},
}
go doWorker(id, w)
return w
}
func chanDemo() {
var workers [10]worker
var wg sync.WaitGroup
wg.Add(20)
for i := 0; i < 10; i++ {
workers[i] = createWorker(i, &wg)
}
for i, worker := range workers {
worker.in <- 'a' + i
}
for i, worker := range workers {
worker.in <- 'A' + i
}
// wait for all of them
wg.Wait()
}
func main() {
chanDemo()
}
本文深入探讨了使用Go语言进行并发编程的两种不同方法。一种是通过channel和done信号来协调goroutine,另一种则是利用sync.WaitGroup来等待所有worker完成任务。通过具体的代码示例,详细解释了每种方法的实现细节和工作原理。
1817

被折叠的 条评论
为什么被折叠?



