«Слишком много открытых файлов» в Golang без открытия каких-либо файлов - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть некоторый 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() вызов файлового дескриптора для каталога, и, не ограничивая количество процедур, моя программа читает слишком много каталогов одновременно?

Это мой первый раз, когда используются программы, так что указатели приветствуются.

1 Ответ

0 голосов
/ 25 февраля 2020

После небольшого исследования я исправил проблему, используя шаблон «подсчета семафора» в этом ответе:

{ ссылка }

Я не уверен если это означает, что этот вопрос является дубликатом, потому что проблема очень похожа, но не совсем такая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...