当我从IDE Goland运行代码时,一切都会按预期进行,但是当我从控制台编译并运行错误时
pipe2: too many open files
pipe2: too many open files
起初,我以为我运行了太多的句柄,但是通过增加/etc/security/limit.conf中的值,没有任何改变。这是运行288 gorutin的代码,我们知道需要处理的确切文件数。我想我可能在代码本身中有一个错误,我想知道如何不一次处理所有文件,而是以单独的块处理文件。
var numThread = 288
var wg sync.WaitGroup
wg.Add(numThread)
for i := 0; i < numThread;i++{
go func() {
parseDataInStdout(done,cmdSlice,reports)
wg.Done()
}()
}
go func() {
wg.Wait()
close(reports)
}(
如果可能的话,我想听听关于如何仍然可以加快处理速度的建议。
func parseDataInStdout(done <-chan struct{},cmnd <-chan string,r chan<- Report){
sliceStr := []string{}
for c := range cmnd{
cmd := exec.Command("sh", "-c", c)
output, err := cmd.StdoutPipe()
if err != nil {
fmt.Println(err)
}
if err := cmd.Start(); err != nil {
fmt.Errorf("RunCommand: cmd.Start(): %v", err)
}
scanner := bufio.NewScanner(output)
outData := []string{}
scanner.Split(bufio.ScanLines)
for scanner.Scan(){
outData = append(outData,scanner.Text())
}
// вырезать с 10 по 24
var purgeData = [14]string{}; var crdIdx = 0
for i := 9; i < 23;i++{
purgeData[crdIdx] = outData[i]
crdIdx++
}
for _, t := range purgeData{
str := parseData(t)
sliceStr = append(sliceStr,str)
}
select {
case r <- Report{parseInt(sliceStr[0]),
parseInt(sliceStr[1]),
parseInt(sliceStr[2]),
parseInt(sliceStr[3]),
parseInt(sliceStr[4]),
parseInt(sliceStr[5]),
parseFloat(sliceStr[6]),
parseFloat(sliceStr[7]),
parseFloat(sliceStr[8]),
parseFloat(sliceStr[9]),
parseFloat(sliceStr[10]),
parseFloat(sliceStr[11]),
parseFloat(sliceStr[12]),
parseFloat(sliceStr[13])}:
case <-done:
return
}
}
}