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
我正在尝试创建一个程序来抓取 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