package main
import (
"context"
"fmt"
"sync"
"time"
)
type BBB struct {
ctx context.Context
chBalanceUpdate chan string
}
func (b *BBB) dosome() {
wg := sync.WaitGroup{}
defer wg.Wait()
for {
select {
case address, ok := <-b.chBalanceUpdate:
if !ok {
fmt.Println(" channel is closed")
// return
}
// create new goroutine to update balance
wg.Add(1)
fmt.Printf("%p", &address)
go func(addr string, w *sync.WaitGroup) { PANIC
defer w.Done()
// get balance of addr and update into database
// b.updateBalance(addr)
fmt.Printf("============do something============:%v\n", address)
}(address, &wg) // 必须使用 &wg, 而不是 wg
}
// time.Sleep(time.Second * 1)
}
}
func (b *BBB) doother() {
for {
time.Sleep(time.Millisecond * 10)
b.chBalanceUpdate <- fmt.Sprintf("hello: %v", time.Now().Unix())
}
// close(b.chBalanceUpdate)
// fmt.Println("=======close channel============")
}
func main() {
// chBalanceUpdate :=
bb := BBB{
ctx: context.Background(),
chBalanceUpdate: make(chan string, 0), // 如果是有buffer的,即当buffer没满的时候就是非阻塞的,那么读取端就是非阻塞的
}
wg := sync.WaitGroup{}
wg.Add(1)
go func() {
defer wg.Done()
bb.doother()
}()
wg.Add(1)
go func() {
defer wg.Done()
bb.dosome()
}()
wg.Wait()
}
golang的channel和waitgroup几个坑
最新推荐文章于 2023-12-27 09:32:54 发布
该代码示例展示了在Golang中如何使用goroutine和channel进行并发处理。`BBB`结构体包含一个上下文和一个用于更新余额通知的channel。`doSome`函数监听channel并在接收到地址时启动新的goroutine更新余额。`doOther`函数周期性地向channel发送数据。整个程序使用`sync.WaitGroup`确保goroutine的正确同步和关闭。
摘要由CSDN通过智能技术生成