golang 系统调用,锁定到线程

golang syscall, locked to thread

我正在尝试创建一个程序来抓取 xml 文件。我正在试验 go 因为它是 goroutines。我有几千个文件,所以某种类型的多处理几乎是必要的...

我有一个程序可以成功 运行,并在一组测试文件上将 xml 转换为 csv(作为测试,不完全是最终结果),但是当 运行 与完整的文件集,它给出了这个:

runtime: program exceeds 10000-thread limit

我一直在寻找类似的问题,有几个,但我还没有找到足够相似的问题来解决这个问题。

最后是一些代码 运行ning:

// main func (start threads)

for i := range filelist {
  channels = append(channels, make(chan Test))
  go Parse(files[i], channels[len(channels)-1])
}

// Parse func (individual threads)

func Parse(fileName string, c chan Test) {
defer close(c)

doc := etree.NewDocument()
if err := doc.ReadFromFile(fileName); err != nil {
    return
}

root := doc.SelectElement("trc:TestResultsCollection")

for _, test := range root.FindElements("//trc:TestResults/tr:ResultSet/tr:TestGroup/tr:Test") {
    var outcome Test
    outcome.StepType = test.FindElement("./tr:Extension/ts:TSStepProperties/ts:StepType").Text()
    outcome.Result = test.FindElement("./tr:Outcome").Attr[0].Value
    for _, attr := range test.Attr {
        if attr.Key == "name" {
            outcome.Name = attr.Value
        }
    }

    for _, attr := range test.FindElement("./tr:TestResult/tr:TestData/c:Datum").Attr {
        if attr.Key == "value" {
            outcome.Value = attr.Value
        }
    }

    c <- outcome
}

}

// main (process results when threads return)

for c := 0; c < len(channels); c++ {
    for i := range channels[c] {
        // csv processing with i
    }
}

我确定其中有一些难看的代码。我最近刚刚从其他语言中学到了 go...所以我提前道歉。无论如何

有什么想法吗?

对于没有包括正确的错误,我深表歉意。 正如评论所指出的那样,我正在做一些愚蠢的事情并为每个文件创建一个例程。感谢 JimB 纠正我,感谢 torek 提供解决方案和这个 link。 https://gobyexample.com/worker-pools

jobs := make(chan string, numJobs)
results := make(chan []Test, numJobs)

for w := 0; w < numWorkers; w++ {
    go Worker(w, jobs, results)
    wg.Add(1)
}

// give workers jobs

for _, i := range files {
    if filepath.Ext(i) == ".xml" {
        jobs <- ("Path to files" + i)
    }
}

close(jobs)
wg.Wait()

//result processing <- results