注意:GetTaskQueue()
返回结构为
type TaskQueue struct {
ch chan int
wg *sync.WaitGroup
}
该通道用于限制goroutine的数量,并且goroutine的最大数量设置为3。
我的期望是所有t
与task
相匹配。但是,Dominium
和dApp Builder
没有显示在t
中,而EthicHub Twitter
和Apollo
是重复的。
输出如下所示。
答案 0 :(得分:1)
正如在前面的答案中提到的那样,任务循环变量的地址始终相同。所以这应该为您工作:
for _, task := range tasks {
t := task
fmt.Println("task ", t.Name)
time.Sleep(2 * time.Second)
go func(t *DB.TaskLog) {
defer GetTaskQueue().Done()
fmt.Println("task ", t.Name)
CrawlAirdrop(t.Link)
}(&t)
select {
case <-ctx.Done():
return
default:
}
}
答案 1 :(得分:0)
循环变量被重用:for循环的每个迭代都使用 same task
变量,因此所有goroutine都接收相同的地址。
(并且不要发布屏幕截图)。