goroutine与通道循环

时间:2018-08-21 01:53:38

标签: go goroutine

enter image description here

注意:GetTaskQueue()返回结构为

的全局变量
type TaskQueue struct {
    ch   chan int
    wg   *sync.WaitGroup
}

该通道用于限制goroutine的数量,并且goroutine的最大数量设置为3。

我的期望是所有ttask相匹配。但是,DominiumdApp Builder没有显示在t中,而EthicHub TwitterApollo是重复的。

输出如下所示。

enter image description here

2 个答案:

答案 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都接收相同的地址。

(并且不要发布屏幕截图)。