2017-03-28 7 views
1

は、今私は次のコードを持っている:goroutineの書き方は?

package main 

import (
    "crypto/md5" 
    "encoding/hex" 
    "fmt" 
    "io" 
    "math" 
    "strconv" 
) 

func Md5Str(str string) string { 
    m := md5.New() 
    io.WriteString(m, str) 
    return hex.EncodeToString(m.Sum(nil)) 
} 

func compute(size int) int { 
    num := int(math.Floor(float64(size+256*1024-1))/256/1024) 
    return num 
} 

func out(s string) string { 
    return "Hello: " + s 
} 

func main() { 
    num := compute(4194304) 
    for i := 0; i < num; i++ { 
     key := Md5Str("503969280ff8679135937ad7d23b06c5" + "_" + strconv.Itoa(i)) 
     res := out(key + "_" + strconv.Itoa(i)) 
     fmt.Println(res) 
    } 
} 

をそして、それは右に実行することができます。

out関数が長時間実行され、並行実行が時間を節約するため、コードを実行する同時実行が必要です。

+2

https://gobyexample.com/worker-pools – zerkms

+1

@zerkmsありがとう~~ – thinkerou

+0

@ScottStensland OK – thinkerou

答えて

1

ありがとう@zerkmsは、私はそれが正しい実行することができますGo by Example: Worker Pools

package main 

import (
    "crypto/md5" 
    "encoding/hex" 
    "fmt" 
    "io" 
    "math" 
    "strconv" 
) 

func Md5Str(str string) string { 
    m := md5.New() 
    io.WriteString(m, str) 
    return hex.EncodeToString(m.Sum(nil)) 
} 

func compute(size int) int { 
    num := int(math.Floor(float64(size+256*1024-1))/256/1024) 
    return num 
} 

func out(s string, jobs <-chan int, results chan<- string) { 
    for j := range jobs { 
     fmt.Println("Hello: " + s + strconv.Itoa(j)) 
     results <- s 
    } 
} 

func main() { 
    num := compute(4194304) 
    jobs := make(chan int, num) 
    results := make(chan string, num) 

    for i := 0; i < num; i++ { 
     key := Md5Str("503969280ff8679135937ad7d23b06c5" + "_" + strconv.Itoa(i)) 
     go out(key+"_"+strconv.Itoa(i), jobs, results) 
    } 

    for j := 0; j < num; j++ { 
     jobs <- j 
    } 
    close(jobs) 

    for k := 0; k < num; k++ { 
     <-results 
    } 
} 

上で、次のコードベースを再書きました。

関連する問題