Go中的并发例程

huangapple go评论82阅读模式
英文:

Concurrent routines in Go

问题

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

英文:

I want to write three concurrent routines that sends integer to each other. Now, I have implemented two concurrent routines which sends integers to each other.

package main
import &quot;rand&quot;

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

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

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

However, when I want to add another routine which wants to send and receive integers to/from the above routines, it gives errors like "throw: all goroutines are asleep - deadlock!". Below is my code:

package main
import &quot;rand&quot;

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

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

func Routine3(command chan int, response chan int) {
for i := 0; i &lt; 1000; i++ {
    x, open := &lt;-command
    if !open {
        return;
    }
     print(x , &quot; 3nd\n&quot;);
    y := rand.Intn(100)
    response &lt;- 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)
}

Can anybody help me, where is my mistake ? And can anybody help me, is it possible to create bidirectional channel or is it possible to create a common channel for int, string etc ?

答案1

得分: 2

你没有在main函数中声明commandresponse变量。

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

You haven't declared the command and response variables in the main function.

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

huangapple
  • 本文由 发表于 2011年11月23日 03:13:13
  • 转载请务必保留本文链接:https://go.coder-hub.com/8232422.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定