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

Я хочу написать три одновременных подпрограммы, которые посылают друг другу целые числа.Теперь я реализовал две параллельные подпрограммы, которые посылают друг другу целые числа.

package main
import "rand"

func Routine1(commands chan int, responses chan int) {
    for i := 0; i < 10; i++ {
        i := rand.Intn(100)
  commands <- i
  print(<-responses, " 1st\n");
}
close(commands)
}

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

func main() 
{
   commands := make(chan int)
   responses := make(chan int)
   go Routine1(commands, responses)
   Routine2(commands, responses)
}

Однако, когда я хочу добавить еще одну подпрограмму, которая хочет отправлять и получать целые числа в / из вышеуказанных подпрограмм, она выдает ошибкикак "бросить: все горутины спят - тупик!"Ниже мой код:

package main
import "rand"

func Routine1(commands chan int, responses chan int, command chan int, response chan int ) {
for i := 0; i < 10; i++ {
    i := rand.Intn(100)
  commands <- i
  command <- i
  print(<-responses, " 12st\n");
  print(<-response, " 13st\n");
}
close(commands)
}

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

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

func main() {
   commands := make(chan int)
   responses := make(chan int)
   command := make(chan int)
   response := make(chan int)
   go Routine1(commands, responses,command, response )
   Routine2(commands, responses)
   Routine3(command, response)
}

Кто-нибудь может мне помочь, где моя ошибка?И кто-нибудь может мне помочь, возможно ли создать двунаправленный канал или можно создать общий канал для int, string и т. Д.?

1 Ответ

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

Вы не объявили переменные command и response в функции main.

func main() {
    commands := make(chan int)
    responses := make(chan int)
    go Routine1(commands, responses, command, response)
    Routine2(commands, responses)
    Routine3(command, response)
}
...