concurrency - Func 不会运行;增量 channel

标签 concurrency go mutex channel goroutine

我正在编写一个函数,我试图在其中增加一个 channel 。在一个更大的程序中,这是行不通的,它实际上卡在一条看起来像这样的线上:

current = <-channel

go func s 正在运行,但程序似乎在这一行停止了。

我试图编写一个较小的 SSCCE,但现在我遇到了不同的问题。在这里:

package main                                                                    

import (                                                                        
    "fmt"                                                                       
)                                                                               

func main() {                                                                   
    count := make(chan int)                                                     

    go func(count chan int) {                                                   
        current := 0                                                            
        for {                                                                   
            current = <-count                                                   
            current++                                                           
            count <- current                                                    
            fmt.Println(count)                                                  
        }                                                                       
    }(count)                                                                    
}

然而,在上面的go func实际上似乎根本没有被调用。如果我放一个 fmt.Println for { 之前的声明,它不会打印出来。如果我把 fmt.Println在它们之前或之后的声明 go func block ,它们都会打印出来。

  1. 为什么上面例子中的自调用 block 似乎根本没有运行?
  2. 如果它正在运行,为什么它会在 current = <-count 上阻塞? ?我怎样才能正确增加 channel ?

最佳答案

没有更多信息,我无法回答第一个问题。您显示的代码有两个问题。首先,goroutine 启动后程序退出。第二个问题是 goroutine 正在等待发送计数的东西,如果你从计数 channel 接收它不会死锁。

这是显示死锁的示例 ( http://play.golang.org/p/cRgjZt7U2A ):

package main

import (
    "fmt"
)

func main() {
    count := make(chan int)

    go func() {
        current := 0
        for {
            current = <-count
            current++
            count <- current
            fmt.Println(count)
        }
    }()
    fmt.Println(<-count)
}

这是一个按照我认为您期望的方式工作的示例 (http://play.golang.org/p/QQnRpCDODu)

package main

import (
    "fmt"
)

func main() {
    count := make(chan int)

    go func() {
        current := 0
        for {
            current = <-count
            current++
            count <- current
            fmt.Println(count)
        }
    }()
    count <- 1
    fmt.Println(<-count)
}

关于concurrency - Func 不会运行;增量 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21616709/

相关文章:

rest - 如何使用 Mutex 字段创建结构的元素

go - 如何编写一个接受 2 个函数(返回结构)并同时运行它们的函数?

java - 管理数据库中的产品数量

java - 我的 ExpirableLazyObject 不是线程安全的吗?有竞争条件吗?

string - 如何检查字符串中的一个或多个符号

dictionary - 如何在实际 map 中转换字符串 "key:value"?

database - 在分布式应用程序中同步数据库访问

发出并发请求时,php curl localhost 很慢

go - 如何修复原始字符串文字上的失败断言

c - 带互斥量的 Linux 线程