16

私はGolangが初めてです。現在、Golang でエニー ツー ワン チャネルを作成する方法を見つけようとしています。セットアップは次のとおりです。

2 つのゴルーチン numgen1 と numgen2 が同時に実行されており、チャネル num1 と resp に数値を書き込んでいるとします。num2. numgen1 と numgen2 から送信された数値を新しいプロセス addnum に追加したいと思います。私はこのようなことを試しました:

func addnum(num1, num2, sum chan int) {
    done := make(chan bool)
    go func() {
        n1 := <- num1
        done <- true
    }()
        n2 := <- num2
        <- done
    sum <- n1 + n2
}

しかし、これは悲しいことに間違っているようです。誰かアイデアを教えてください。

ご助力ありがとうございます。

4

3 に答える 3

8

最も簡単な答えは

func addnum(num1, num2, sum chan int) {
  n1 := <- num1
  n2 := <- num2
  sum <- n1 + n2
}

num1計算を行うにはとの両方が必要なのでnum2、それ以外の方法では意味がありません。結局、可能な実行順序は 2 つあります。

  1. num1数値を生成し、その後に続くnum2
  2. num2数値を生成し、その後に続くnum1

最初のケースでは、チャネルの読み取りは実行順序に正確に対応しています。num12 番目のケースでは、最初の読み取りは最終的に数値が生成されるまでブロックされます。num2チャネルにはすでに番号があるため、2 回目の読み取りはほぼ瞬時に完了します。

Go のチャネルについて詳しく知りたい場合は、 http: //godoc.org/github.com/thomas11/cspを参照することをお勧めします。これは、Go で記述された Hoare の CSP の例のコレクションです。

于 2013-12-15T09:47:30.610 に答える
4

「複数のチャネルから同時に読み取る」という質問に答えるには

複数のチャンネルを同時に聞く方法があります。

func main() {

    c1 := make(chan string)
    c2 := make(chan string)

    ...
    go func() {
        for {
            select {
                case msg1 := <- c1:
                fmt.Println(msg1)

                case msg2 := <- c2:
                fmt.Println(msg2)
             }
        }
    }()

この例では、チャネル msg1 と msg2 を作成します。次に、無限ループを含む go ルーチンを作成します。このループでは、msg1 と msg2 をリッスンします。このシステムを使用すると、複数のチャネルを同時に読み取り、メッセージが到着したときにメッセージを処理できます。

リークを避けるために、おそらく別のチャネルを追加して、ゴルーチンを停止する必要があります。

于 2013-12-16T00:19:08.733 に答える