У меня есть некоторый go код для обхода каталога, и он не работает с panic: fcntl: too many open files
при запуске. Проблема в том, насколько я знаю, я не открыл ни одного файла (и у меня нет объектов File, которые я могу вызвать .Close () on).
package main
import (
"sync"
"io/ioutil"
"path"
)
func walk (cfg config) {
var wg sync.WaitGroup
wg.Add(1)
go processDir(cfg.fromDir, "", &wg, cfg)
wg.Wait()
}
// path, relative path, waitGroup, config
func processDir (pth string, relPth string, wg *sync.WaitGroup, cfg config) {
defer wg.Done()
flInfo, err := ioutil.ReadDir(pth)
if err != nil {
panic(err)
}
for _, f := range flInfo {
var fPath = f.Name()
var isDir = f.IsDir()
if cfg.shouldIgnore(fPath) {
continue
}
wg.Add(1)
var newAbs = path.Join(pth, fPath)
if isDir {
var newRel = path.Join(relPth, fPath)
go processDir(newAbs, newRel, wg, cfg)
} else {
go processFile(newAbs, relPth, wg, cfg)
}
}
}
func processFile (pth string, relPth string, wg *sync.WaitGroup, cfg config) {
defer wg.Done()
// TODO: Process file
}
I'm Интересно, вызывает ли ioutil.ReadDir()
вызов файлового дескриптора для каталога, и, не ограничивая количество процедур, моя программа читает слишком много каталогов одновременно?
Это мой первый раз, когда используются программы, так что указатели приветствуются.