2012-01-15 3 views
1

私は、次の3つの方法で入力のいくつかの種類を解析していたとします同期チャネル?

func parseHeader ([]byte) []byte 
func parseBody ([]byte) []byte 
func parseFooter ([]byte) []byte 

彼らはすべて同じ入力の特定の部分を解析し、[]byteとしてそれを返すので、彼らはこのように使用することができます。

i := []byte(/* the input */) 
b := new(bytes.Buffer) 

b.Write(parseHeader(i)) 
b.Write(parseBody(i)) 
b.Write(parseFooter(i)) 

ここでは、これらの3つのプロセスをチャネルを使用して並列化したいと考えています。私の考えは、これらの関数にチャネルを渡して書き込みをすることでしたが、どうすれば正しい順序でチャネルに書き込むことができますか?(すなわち体が体の後、ヘッダーとフッター後チャネルに書き込まれていること)

答えて

5

基本的にあなたが余分な手を行うには、メッセージの追加の層を追加することなく、することはできません少なくともありません振とう。 3つの別々のチャネルを使用して、受信したい順番でそれらから読み取ることをお勧めします。つまり、送信プロセスの書き込み順序について心配する必要はありません。ここで

は、最小限の例です:

package main 

import "fmt" 

func sendme(num int, ch chan int) { 
     ch <- num // send integer 'num' down chan ch 
} 

func main() { 
     // Create three new channels 
     one := make(chan int) 
     two := make(chan int) 
     three := make(chan int) 

     // Start each parallel invocation of "sendme" as a go routine, in any order 
     go sendme(3, three) 
     go sendme(1, one) 
     go sendme(2, two) 

     // Read from each channel in the order we wish to process the 
     // data 
     fmt.Println(<- one, <- two, <- three) 
} 
+0

私は3つのチャンネルを使ってどのようにできるのか教えてください。 =)それはすばらしいでしょう。 – thwd

+0

OK、完了です。明らかに、あなたはこれをちょっと元気にすることができます。たとえば、チャネルを配列に格納することができます。 – snim2

+0

ありがとう=] – thwd

1

は、ここでは、一緒にプレイするためにかなり有用な例です。私はシーケンスを記録するためにここに余分なものがありますので、物事が順不同で終了することがありますが、できるだけ早く表示されますが、前の終了より早く表示されます。

package main 

import (
    "fmt" 
    "math/rand" 
    "time" 
) 

func deferredString(lbl string, f func() string) (rv chan string) { 
    rv = make(chan string) 
    go func() { 
     s := f() 
     fmt.Printf("Finished %s\n", lbl) 
     rv <- s 
    }() 
    return rv 
} 

func do(rv string) string { 
    t := rand.Intn(5) 
    fmt.Printf("Sleeping for %d seconds for %s\n", t, rv) 
    time.Sleep(time.Duration(t) * time.Second) 
    return rv 
} 

func main() { 
    rand.Seed(int64(time.Now().Nanosecond())) 

    cha := deferredString("a", func() string { return do("a") }) 
    chb := deferredString("b", func() string { return do("b") }) 
    chc := deferredString("c", func() string { return do("c") }) 

    fmt.Printf("a: %s\n", <-cha) 
    fmt.Printf("b: %s\n", <-chb) 
    fmt.Printf("c: %s\n", <-chc) 
} 
+0

すごくすごい!どうもありがとうございました。これをもっと深く分析します。 – thwd

関連する問題