Параллельные процедуры в Google Go Language - PullRequest
1 голос
/ 23 ноября 2011

Возможно ли в ходу: Предположим, у меня есть 3 одновременных подпрограммы, которые могут отправлять друг другу целые числа. Теперь предположим, что обе параллельные подпрограммы 2 и 3 отправляют целое число в параллельную подпрограмму 1. Возможно ли, что в подпрограмме 1 обе величины принимаются и обрабатываются дальше? Чтобы было понятно, у меня есть следующий код:

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 ]

2 голосов
/ 23 ноября 2011

Я ненавижу абстрактные примеры, в любом случае, я сделаю все возможное, чтобы ответить на ваш вопрос.

Возможно ли в начале, что процедура 1 принимает оба значения и обрабатывает их дальше?

Что вы хотите архивировать? Внутри рутины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

OR

// 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 может только читать команды из канала с именем command1, но рутина 2 и рутина 3 могут использовать один и тот же канал команды 1 для отправки сообщений в рутину 1.

Еще одна распространенная идиома в Go - передача канала ответа как части сообщения. Например:

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)
}

В зависимости от вашей реальной проблемы это может значительно упростить вашу программу:)

0 голосов
/ 23 ноября 2011

Это невозможно в GO, я имею в виду создание параллельных каналов.

...