Multithreading ';打开的文件太多';在Golang中不打开任何文件

Multithreading ';打开的文件太多';在Golang中不打开任何文件,multithreading,go,file-io,concurrency,Multithreading,Go,File Io,Concurrency,我有一些遍历目录的go代码,当运行时,它会失败,因为panic:fcntl:打开的文件太多。问题是,据我所知,我还没有打开任何文件(也没有任何可以调用.Close()的文件对象) 主程序包 进口( “同步” “io/ioutil” “路径” ) func步行(cfg配置){ var wg sync.WaitGroup 工作组.添加(1) go processDir(cfg.fromDir,“,&wg,cfg) wg.Wait() } //路径,相对路径,等待组,配置 func processDi

我有一些遍历目录的go代码,当运行时,它会失败,因为
panic:fcntl:打开的文件太多。问题是,据我所知,我还没有打开任何文件(也没有任何可以调用.Close()的文件对象)

主程序包
进口(
“同步”
“io/ioutil”
“路径”
)
func步行(cfg配置){
var wg sync.WaitGroup
工作组.添加(1)
go processDir(cfg.fromDir,“,&wg,cfg)
wg.Wait()
}
//路径,相对路径,等待组,配置
func processDir(pth字符串、relPth字符串、wg*sync.WaitGroup、cfg config){
推迟工作组完成()
flInfo,err:=ioutil.ReadDir(pth)
如果错误!=零{
恐慌(错误)
}
对于uf:=范围flInfo{
var fPath=f.Name()
var isDir=f.isDir()
如果cfg.shouldIgnore(fPath){
持续
}
工作组.添加(1)
var newAbs=path.Join(pth,fPath)
中频isDir{
var newRel=path.Join(relPth,fPath)
go processDir(新ABS、新REL、wg、cfg)
}否则{
go进程文件(newAbs、relPth、wg、cfg)
}
}
}
func进程文件(pth字符串、relPth字符串、wg*sync.WaitGroup、cfg config){
推迟工作组完成()
//TODO:进程文件
}
我想知道,
ioutil.ReadDir()
调用是否打开了目录的文件描述符,并且在不限制goroutine数量的情况下,我的程序一次读取了太多目录


这是我第一次使用goroutines,因此任何指针都是值得赞赏的。

经过一番调查,我在回答中使用了“计数信号量”模式解决了这个问题:


我不确定这是否意味着这个问题是重复的,因为问题非常相似,但不完全相同。

目录只是特殊文件。ReadDir打开目录并读取它。如果同时调用太多ReadDir,可能会遇到文件描述符限制问题。答案应该包括问题的解决方案,而不仅仅是链接。