为什么控制台中的应用程序会生成错误,但是IDE中的所有内容都能正常工作?

时间:2019-05-22 10:45:23

标签: linux algorithm go

当我从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
                }

        }

}

0 个答案:

没有答案