Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与n个goroutine通信_Go_Concurrency - Fatal编程技术网

与n个goroutine通信

与n个goroutine通信,go,concurrency,Go,Concurrency,我试图在golang中使用n个通过通道通信的goroutine实现斐波那契递归 我从函数返回一个整数,但实际上我只是通过通道c发送f(n-1)+f(n-2)之和,但这不能正常工作。它正确地打印前两个值,之后的每个值仅为1 package main import "fmt" // Fibonacci in a recursive version func fiboR(n int, c chan int ) int { if(n == 0){ c <- 0 r

我试图在golang中使用n个通过通道通信的goroutine实现斐波那契递归

我从函数返回一个整数,但实际上我只是通过通道c发送f(n-1)+f(n-2)之和,但这不能正常工作。它正确地打印前两个值,之后的每个值仅为1

package main

import "fmt"

// Fibonacci in a recursive version
func fiboR(n int, c chan int ) int {

  if(n == 0){
      c <- 0
      return 0
  } else if n == 1 {
      c <- 1
      return 1
  } else{
      c <- fiboR(n-1,c) + fiboR(n-2,c)
      return fiboR(n-1,c) + fiboR(n-2,c)
  }

}


func main() {
  for i := 0; i < 10; i++ {
    procchan := make(chan int)
    go fiboR(i,procchan)
    fmt.Println(i,<-procchan )
}
}
主程序包
输入“fmt”
//递归版本中的斐波那契
函数fiboR(n int,c chan int)int{
如果(n==0){

c当增加i的值时,您的解决方案将尝试输出多个从通道中提取的值。 您的代码将尝试为每个i向通道发送的内容:

0: 0
1: 1
2: 1,0,1
3: 1,0,1,1,2
4: 1,0,1,1,2,1,0,1,3
...
由于您为每个i创建一个新通道,然后只提取一个值,因此您将始终获得上面一行中的第一个值

如果您尝试使用这些修改运行它,它将输出您想要的()

主程序包
输入“fmt”
//递归版本中的斐波那契
func fiboRchan(n int,c chan int){

c加上@nissefors答案,那里的主要过程很可能是一个连续的过程,因为在for循环中,您将等待通道返回,然后继续下一个迭代

主功能中的一个小修改可以一次触发所有fibonaccis,然后在一个单独的for循环中,可以访问对应于每个go例程的通道

游乐场网址:

主程序包
输入“fmt”
//递归版本中的斐波那契
func fiboRchan(n int,c chan int){
fmt.Println(“处理%d”,n)

c如果您正在访问
Yes,它与sequential相同;t启动一个goroutine,等待它的第一个结果,打印它的结果,然后启动另一个goroutine。问题是您的goroutines在每个递归中都返回通道上的值,因此,当您在f(2)调用之前调用f(2)时,将其值放入通道上时,所有的f(1)和f(0)在这之前,每个人依次将他们的值放到频道上。而且由于您只获取导致问题的第一个值。@NanduKalidindi抱歉,我显然没有检查用户名,并且响应时就好像您在3rdeye7中一样
package main

import "fmt"

// Fibonacci in a recursive version
func fiboRchan(n int, c chan int) {
    c <- fiboR(n)
}

func fiboR(n int) int {

    if n == 0 {
        return 0
    } else if n == 1 {
        return 1
    } else {
        return fiboR(n-1) + fiboR(n-2)
    }

}

func main() {

    for i := 0; i < 10; i++ {
        procchan := make(chan int)
        go fiboRchan(i, procchan)
        fmt.Println(i, <-procchan)
    }

}
package main

import "fmt"

// Fibonacci in a recursive version
func fiboRchan(n int, c chan int) {
        fmt.Println("PROCESSING FOR %d", n)
    c <- fiboR(n)
}

func fiboR(n int) int {
    if n == 0 {
        return 0
    } else if n == 1 {
        return 1
    } else {
        return fiboR(n-1) + fiboR(n-2)
    }

}

func main() {
    var arr[10]chan int
    for i := 0; i < 10; i++ {
        procchan := make(chan int)
        arr[i] = procchan
        go fiboRchan(i, procchan)
    }
    // By now all the go routines are fired

    // Now iterate through the channel array and read from the
    // respective channel
    for i:=0; i< 10; i++ {
        fmt.Println(i, <-arr[i])
    }

}