如何进行嵌套goroutine

如何进行嵌套goroutine,go,Go,以下是我迄今为止的一段代码 func DownloadFile(filepath string, url string) { resp, err := http.Get(url) if err != nil { log.Fatal(err) } defer resp.Body.Close() out, err := os.Create(filepath) if err != nil { log.Fatal(err)

以下是我迄今为止的一段代码

func DownloadFile(filepath string, url string) {
    resp, err := http.Get(url)
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()
    out, err := os.Create(filepath)
    if err != nil {
        log.Fatal(err)
    }
    defer out.Close()
    _, err = io.Copy(out, resp.Body)
    if err != nil {
        log.Fatal(err)
    }
    wg.Done()
}

func main() {
    for {

        fp := <computes filepath>
        u := <computes url>
        zero := len(x.String())
        j := 1

        for {
            wg.Add(1)
            pad := fmt.Sprintf("%0" + strconv.Itoa(zero) + "d", j)
            go DownloadFile(fp + string(os.PathSeparator) + pad + ".txt", u)
            j = j + 1
        }
        wg.Wait()

    }
}
func下载文件(文件路径字符串、url字符串){
resp,err:=http.Get(url)
如果错误!=零{
log.Fatal(错误)
}
延迟响应主体关闭()
out,err:=os.Create(文件路径)
如果错误!=零{
log.Fatal(错误)
}
推迟结束
_,err=io.Copy(out,resp.Body)
如果错误!=零{
log.Fatal(错误)
}
wg.Done()
}
func main(){
为了{
fp:=
u:=
零:=len(x.String())
j:=1
为了{
工作组.添加(1)
pad:=fmt.Sprintf(“%0”+strconv.Itoa(零)+“d”,j)
转到下载文件(fp+字符串(os.PathSeparator)+pad+“.txt”,u)
j=j+1
}
wg.Wait()
}
}

现在,goroutine是在内部for循环中启动的。我想通过在外部for循环中添加goroutines来加快我的程序

编辑:进度条

每次外部for循环增加时,进度条都会增加。我希望它仅在内部for循环完成时递增

func DownloadFile(filepath string, url string) {
    resp, err := http.Get(url)
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()
    out, err := os.Create(filepath)
    if err != nil {
        log.Fatal(err)
    }
    defer out.Close()
    _, err = io.Copy(out, resp.Body)
    if err != nil {
        log.Fatal(err)
    }
    wg.Done()
}

func main() {
    for {

        fp := <computes filepath>
        u := <computes url>
        zero := len(x.String())
        count := int(x.Int())
        bar := pb.StartNew(count)
        j := 1

        for {
            bar.Increment()
            wg.Add(1)
            pad := fmt.Sprintf("%0" + strconv.Itoa(zero) + "d", j)
            go DownloadFile(fp + string(os.PathSeparator) + pad + ".txt", u)
            j = j + 1
        }

    }
    wg.Wait()
    bar.Finish()
}
func下载文件(文件路径字符串、url字符串){
resp,err:=http.Get(url)
如果错误!=零{
log.Fatal(错误)
}
延迟响应主体关闭()
out,err:=os.Create(文件路径)
如果错误!=零{
log.Fatal(错误)
}
推迟结束
_,err=io.Copy(out,resp.Body)
如果错误!=零{
log.Fatal(错误)
}
wg.Done()
}
func main(){
为了{
fp:=
u:=
零:=len(x.String())
计数:=int(x.int())
条形图:=pb.StartNew(计数)
j:=1
为了{
bar.Increment()
工作组.添加(1)
pad:=fmt.Sprintf(“%0”+strconv.Itoa(零)+“d”,j)
转到下载文件(fp+字符串(os.PathSeparator)+pad+“.txt”,u)
j=j+1
}
}
wg.Wait()
吧台
}

“我想通过在外部for循环中添加goroutines来加快我的程序。”---goroutines没有必要加快速度(通常相反)。仅仅创建更多的goroutine只能保证您的代码变得更加复杂和脆弱。你到底为什么要创建更多的goroutine?创建更多goroutine解决了什么特殊问题?@zerkms我没有利用现有代码提供的全部互联网带宽。现在,由于内部for循环的迭代次数有限,它的最大下载速度为8Mbps。通过在外部for循环中添加go例程,我不必等待内部for循环完成,就可以跳转到外部for循环的下一个迭代。内部for循环平均迭代25次,外部for循环平均迭代250次。那么为什么不将
wg.Wait()
移出外部循环呢?如果您不想等待内部循环完成,请不要等待。。。谢谢。@zerkms在移动
wg.Wait()
之前,我同时使用实现了一个进度条。现在,在进入外循环的下一个迭代之前,它不会等待内循环完成,我如何检查内循环是否已实际完成以在进度条中反映它?