```
package main
import (
"encoding/json"
"log"
"sync"
)
var ResData []ItemData
var ch = make(chan ItemData)
func do(u UserRes,item ItemData,p Param, waitGroup *sync.WaitGroup) {
defer waitGroup.Done()
//do something 5-10s
item.money_total = 1
ch<-item
}
func main() {
sql := "SELECT id FROM user limit 10000"
rows, err := dbCon.Queryx(sql)
if err != nil {
log.Fatalf("err: %v", err)
}
defer rows.Close()
var wg sync.WaitGroup
for rows.Next() {
wg.Add(1)
var u UserRes
var item ItemData
err = rows.StructScan(&u)
if err != nil {
log.Fatalf("err: %v", err)
}
go do(u,item,p,&wg)
ResData = append(ResData,<- ch)
}
json, err := json.Marshal(ResData)
if err != nil {
log.Fatalf("JSON ERR: %v", err)
}
wg.Wait()
}
```
这上面是部分代码示意
大概需求就是我需要给每个用户生成一份报表。每个用户生成时间大概就是5-10s,但是用户比较多
然后我发现我这样写好像还是需要很久的时间才能全部处理完
感觉是我对哪块的理解有问题或者是哪里阻塞了。
或者大佬们一般这种任务是怎么处理的。用什么组件
这段程序是一条一条的处理的逻辑,速度肯定相比于多goroutine是慢的多了。阻塞在channel没有缓存。
1、数据检索可以批量检索出来,一次检索5000条都没问题,放到内存中肯定比多次去数据库里检索来的快。
2、既然用了channel,就用带有缓存的来处理,make(chan ItemData, 500),如果内存足够大,设置5000个都没问题;
#4
更多评论
```go
ch<-item
ResData = append(ResData,<- ch)
```
这是个无缓存的chan,必须发送/接受结束才会下一步。
可以带个缓存试试。若要存储执行结果,可以用sync.map。
#1