1

goで可能ですか:互いに整数を送信できる3つの並行ルーチンがあるとします。ここで、並行ルーチン2と3の両方が同時ルーチン1に整数を送信するとします。ルーチン1が2つの値の両方を取り、それをさらに処理することは可能ですか?明確にするために、私は次のコードを持っています:

package main
import "rand"

func Routine1(command12 chan int, response12 chan int, command13 chan int, response13 chan int ) {
for i := 0; i < 10; i++ {
    i := rand.Intn(100)
if i%2 == 0 {
command12 <- i 
}

if i%2 != 0 {
command13 <- i 
}

print(<-response13, " 1st\n");
}
close(command12)
}

func Routine2(command12 chan int, response12 chan int, command23 chan int, response23 chan int) {
for i := 0; ; i++ {
    x, open := <-command12
    if !open {
        return;
    }
     print(x , " 2nd\n");
    y := rand.Intn(100)
    if i%2 == 0 {
command12 <- y 
}

if i%2 != 0 {
command23 <- y 
}
}
}

func Routine3(command13 chan int, response13 chan int, command23 chan int, response23 chan int) {
for i := 0; ; i++ {
    x, open := <-command13
    if !open {
        return;
    }
     print(x , " 3nd\n");
    y := rand.Intn(100)
    response23 <- y
}
}

func main() {
   command12 := make(chan int)
   response12 := make(chan int)
   command13 := make(chan int)
   response13 := make(chan int)
   command23 := make(chan int)
   response23 := make(chan int)

   go Routine1(command12, response12,command13, response13 )
   Routine2(command12, response12,command23, response23)
   Routine3(command13, response13,command23, response23 )
}

ここで、この例では、ルーチン1はintをルーチン2または3に送信できます。これはルーチン3だと思います。ここで、ルーチン3もintをルーチン2に送信するとします。ルーチン2がこれら2つの値を取り、処理することは可能ですか。さらに(動的並行ルーチン)?どんな体もそれに応じてこのプログラムを変更するのを助けることができますか?

4

2 に答える 2

2

私は抽象的な例が嫌いです、とにかく私はあなたの質問に答えるために最善を尽くします。

ルーチン1が2つの値の両方を取り、それをさらに処理することは可能ですか?

何をアーカイブしたいですか?ルーチン1内では、次のいずれかを実行できます。

// Read exactly one command from routine2 as well as exactly
// one command from routine3
cmd1 := <-command12
cmd2 := <-command13
// Process the pair of the two commands here

また

// Process a single command only, which was either sent by routine2
// or by routine3. If there are commands available on both channels
// (command12 and command13) the select statement chooses a branch
// fairly.
select {
    case cmd1 := <-command12:
        // process command from routine 2
    case cmd2 := <-command13
        // process command from routine 3
}

それがあなたの質問に答えることを願っています。また、Goチャネルは、デフォルトで複数のライター(および複数のリーダー)をサポートしていることにも注意してください。したがって、ゴルーチンごとに1つの入力チャネルを使用するだけで十分な場合があります。たとえば、routine1はcommand1というチャネルからのコマンドのみを読み取る場合がありますが、routine2とroutine3の両方が同じcommand1チャネルを使用してメッセージをroutine1に送信する場合があります。

Goのもう1つの一般的なイディオムは、メッセージの一部として応答チャネルを渡すことです。例えば:

type Command struct {
    Cmd string
    Reply chan-> int
}

func routine2() {
    reply := make(chan int)
    command1 <- Command{"doSomething", reply}
    status := <-reply
}

func routine1() {
    cmd <- command1;
    // process cmd.Cmd
    cmd.Reply <- 200 // SUCCESS (status code)
}

実際の問題によっては、これによりプログラムが大幅に簡素化される場合があります:)

于 2011-11-23T10:44:17.607 に答える
0

GOでは不可能です。つまり、並行チャネルを作成するということです。

于 2011-11-23T00:12:19.180 に答える