GolangでPythonのパッケージをアップデートするプログラムについて
Golangでpythonのパッケージ全てを並列実行で高速に最新にするものを作りたいのですが、どうすればいいのでしょうか?
goルーチンを使い、書いてみましたが下記のPythonのスクリプトより遅くなってしまいます。
Golangでマルチプロセスで実行するにはどうすればいいのでしょうか?
下記のPythonスクリプトのようなことをGolangで実現したいと思っています。
#!/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()
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)
}
}