GolangでPythonのパッケージをアップデートするプログラムについて


Golangでpythonのパッケージ全てを並列実行で高速に最新にするものを作りたいのですが、どうすればいいのでしょうか?  
goルーチンを使い、書いてみましたが下記のPythonのスクリプトより遅くなってしまいます。  
Golangでマルチプロセスで実行するにはどうすればいいのでしょうか?  
下記のPythonスクリプトのようなことをGolangで実現したいと思っています。

[code]

    
    #!/usr/local/bin/python3.4
    # coding:utf-8
    
    from multiprocessing import Process
    import re
    import subprocess
    import os
    
    def u(v):
        os.system("echo 'mypassword' | sudo -S -H -p '' pip3.4 install " + v + " -U")
    
    output = subprocess.check_output(["pip3.4", "freeze"]).decode()
    output_list = re.findall(".+(?===)", output)
    output_list.extend(["pip", "setuptools"])
    print(output_list)
    
    for v in output_list:
        Process(target=u, args=(v,)).start()
    
    
[/code]

[code]

    
    package main
    
    import (
        "fmt"
        "os"
        "os/exec"
        "regexp"
        "strings"
        "log"
    )
    
    func main() {
        out, err := exec.Command("pip3.4", "freeze").Output()
        if err != nil {
            log.Fatal(err)
        }
        str_output := string(out)
        re := regexp.MustCompile(".+==")
        re_list := re.FindAllString(str_output, -1)
        for _, v := range re_list {
            c := make(chan string, 1)
            go update(v[:len(v)-2], c)
            command_output := <-c
            fmt.Println(command_output)
        }
        fmt.Println("end")
    
    }
    
    func update(package_name string, s chan string) {
        cmd := exec.Command(os.Getenv("SHELL"), "-c", "pip install "+package_name+" -U")
        cmd.Stdin = strings.NewReader("mypassword\n")
        out, err := cmd.Output()
        out_str := string(out)
        s <- out_str
        if err != nil {
            log.Fatal(err)
        }
    }
    
    
    
[/code]




チャンネル受信時のブロックによりループの途中で`update`の終了を待機してしまうため、並列実行されていないと思います。以下のようにチャンネルの受信を別のループ内で行ってみてください。

[code]

    func main() {
        out, err := exec.Command("pip3.4", "freeze").Output()
        if err != nil {
            log.Fatal(err)
        }
        str_output := string(out)
        re := regexp.MustCompile(".+==")
        re_list := re.FindAllString(str_output, -1)
    
        c := make(chan string)
        for _, v := range re_list {
            go update(v[:len(v)-2], c)
        }
        for range re_list {
            fmt.Println(<-c)
        }
        fmt.Println("end")
    }
    
[/code]




チャンネル受信時のブロックによりループの途中で`update`の終了を待機してしまうため、並列実行されていないと思います。以下のようにチャンネルの受信を別のループ内で行ってみてください。

[code]

    func main() {
        out, err := exec.Command("pip3.4", "freeze").Output()
        if err != nil {
            log.Fatal(err)
        }
        str_output := string(out)
        re := regexp.MustCompile(".+==")
        re_list := re.FindAllString(str_output, -1)
    
        c := make(chan string)
        for _, v := range re_list {
            go update(v[:len(v)-2], c)
        }
        for range re_list {
            fmt.Println(<-c)
        }
        fmt.Println("end")
    }
    
[/code]

