- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想了解为什么这种情况会陷入僵局,而另一种情况却不会。
如果我在 goroutine 中关闭 channel ,它工作正常,但如果我在 WaitGroup.Wait()
之后关闭它会导致死锁。
package main
import (
"fmt"
"io/ioutil"
"os"
"sync"
)
var (
wg = sync.WaitGroup{}
links = make(chan string)
)
func rec_readdir(depth int, path string) {
files, _ := ioutil.ReadDir(path)
for _, f := range files {
if symlink, err := os.Readlink(path + "/" + f.Name()); err == nil {
links <- path + "/" + symlink
}
rec_readdir(depth+1, path+"/"+f.Name())
}
if depth == 0 {
wg.Done()
// close(links) // if close here ok
}
}
func main() {
wg.Add(1)
go rec_readdir(0, ".")
for slink := range links {
fmt.Println(slink)
}
wg.Wait()
close(links) // if close here deadlock
}
最佳答案
for slink := range links
将继续循环直到 channel 关闭。所以您显然无法在该循环之后 关闭。正如您所观察到的那样,当您这样做时,您会陷入僵局。
关于go - 关闭 chan 时出现死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48517771/
Golang 新手在这里。 两者在功能上有区别吗 func randomNumberGenerator() <-chan int { 和 func randomNumberGenerator() ch
我想从一个函数返回一个 []<-chan int 给定的 []chan int,但即使转换也不起作用。 你 可以将 分配给 chan T 或 chan<- T (隐式类型转换)。我不知道为什么你 不能
在golang中,当我们需要等待某事完成时,我们会使用一个channel。 例子: done := make(chan struct{}) go func() { // ... clo
我正在实现一个简单的工作池算法,其中 1 个 Sender(调度程序)将作业发送到 M(Worker)go 例程。为此,它使用一个 channel 的 channel 来为第一个空闲的工作人员分配一个
这是我收到的错误消息: cannot use c.ReceiverChans (type []chan *Message) as type []chan interface {} in functio
package main import "fmt" func x(foo []string, cz chan string) { for i := range foo { cz
刚接触golang,开始写一些基于prometheus client-go的monitor exporter,发现promethues的源码中有这样定义channel var的代码 reloadCh
今天我在学习 channels 和 goroutine of go。我遇到了一些让我困惑的现象。 我的 go 文件如下所示: package main import ( "fmt" ) fun
有如下代码: func consumeQueue(ch *amqp.Channel, q_Name string) (chan amqp.Delivery) { msgs, err := ch
我的问题来自尝试读取 channel ,如果可以的话,或者写它,如果可以的话,使用 select声明。 我知道像 make(chan bool, 1) 这样指定的 channel 被缓冲了,我的部分问
遇到golang channel 的一个问题:发现go 协程读取channel 数据 并没有按照预期进行协作执行。 经过查资料: 使用channel 操作不当导致,channel分 有
我认为它们是一样的,但是The go memory model中有一个这样的词:, 如果 channel 被缓冲(例如,c = make(chan int, 1))那么程序将不能保证打印“hello,
我知道如果有多个“通信”可以在 select 中进行。声明一个是随机选择的。我正在尝试找到一种替代方法,它可以更喜欢一种“交流”而不是另一种。 背景是我正在使用上下文杀死的 channel 上的 go
我想维护一个 channel 集合,并且能够添加和删除 channel 。是否定义了相等性,以便我可以正确地 conj 和 disj ? 换句话说,这总是有效吗? => (def chan-colle
一段时间以来,我一直在尝试理解 Go 中的 channel 。但有一件事让我感到奇怪。当你打电话时究竟发生了什么, for { select { case <-chan: } } 它是
是否可以让函数 funcWithNonChanResult 具有以下接口(interface): func funcWithNonChanResult() int { 如果我想让它在接口(interf
我有一个功能: func f(input interface{}) interface{} { t := reflect.ChanOf(reflect.BothDir, ) c :=
我正在编写一个 python 脚本,我正在尝试获取相机 .chan 光圈值 - 水平和垂直,因为我将使用这些值并将其传输到 Maya 相机中。 但是,即使我打开 .chan,我也只看到几行/列/行或属
我正在尝试调用 name.com API(并且成功了,除了一次调用......当我尝试调用他们的 Search() 方法时,我收到错误。 这是我的代码: func TestExecute() stri
我想了解为什么这种情况会陷入僵局,而另一种情况却不会。 如果我在 goroutine 中关闭 channel ,它工作正常,但如果我在 WaitGroup.Wait() 之后关闭它会导致死锁。 pac
我是一名优秀的程序员,十分优秀!