第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Golang上傳整個(gè)目錄并發(fā)返回許多打開(kāi)的文件

Golang上傳整個(gè)目錄并發(fā)返回許多打開(kāi)的文件

Go
森林海 2021-08-16 16:08:08
我正在嘗試將整個(gè)目錄上傳到服務(wù)器。它適用于小目錄,但有 100 多張圖片,它返回“許多打開(kāi)的文件”錯(cuò)誤。我在讀取文件后立即關(guān)閉該文件。知道如何解決這個(gè)問(wèn)題嗎?這是我的代碼    func uploadDir(path string) error {    dir, err := os.Open(path)    if err != nil {        return err    }    files, err := dir.Readdirnames(-1)    if err != nil {        return err    }    dir.Close()    errChan := make(chan error)    resChan := make(chan *client.PutResult)    remaining := len(files)    for _, file := range files {        file := file        go func() {            file, err := os.Open(path + "/" + file)            if err != nil {                errChan <- err            }            c := client.NewClient(os.Getenv("DROPS_SERVER"))            res, err := c.Upload(client.NewUploadHandleFromReader(file))            file.Close()            if err != nil {                errChan <- err            }            resChan <- res        }()    }    for {        select {        case res := <-resChan:            log.Println(res)            remaining--        case err := <-errChan:            if err != nil {                return err            }        }        if remaining == 0 {            break        }    }    return nil}
查看完整描述

2 回答

?
慕雪6442864

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊

原始代碼不限制活動(dòng) go 例程的數(shù)量,因此不限制打開(kāi)的文件描述符的數(shù)量。一些操作系統(tǒng)對(duì)打開(kāi)的文件描述符的數(shù)量有限制。解決方法是創(chuàng)建固定數(shù)量的工作程序 go 例程。


func uploadDir(path string) error {


    // Read directory and close.


    dir, err := os.Open(path)

    if err != nil {

        return err

    }

    names, err := dir.Readdirnames(-1)

    if err != nil {

        return err

    }

    dir.Close()


    // Copy names to a channel for workers to consume. Close the

    // channel so that workers stop when all work is complete.


    namesChan := make(chan string, len(names))

    for _, name := range names {

        namesChan <- name

    }

    close(namesChan)


    // Create a maximum of 8 workers


    workers := 8

    if len(names) < workers {

        workers = len(names)

    }


    errChan := make(chan error, 1)

    resChan := make(chan *client.PutResult, len(names))


    // Run workers


    for i := 0; i < workers; i++ {

        go func() {

            // Consume work from namesChan. Loop will end when no more work.

            for name := range namesChan {

                file, err := os.Open(filepath.Join(path, name))

                if err != nil {

                    select {

                    case errChan <- err:

                        // will break parent goroutine out of loop

                    default:

                       // don't care, first error wins

                    }

                    return

                }

                c := client.NewClient(os.Getenv("DROPS_SERVER"))

                res, err := c.Upload(client.NewUploadHandleFromReader(file))

                file.Close()

                if err != nil {

                    select {

                    case errChan <- err:

                        // will break parent goroutine out of loop

                    default:

                       // don't care, first error wins

                    }

                    return

                }

                resChan <- res

            }

        }()

    }


    // Collect results from workers 


    for i := 0; i < len(names); i++ {

        select {

        case res := <-resChan:

            log.Println(res)

        case err := <-errChan:

            return err

        }

    }

    return nil

}

作為獎(jiǎng)勵(lì),我修改了通道大小并發(fā)送操作,以便在出現(xiàn)錯(cuò)誤時(shí)不會(huì)卡住 goroutine。


查看完整回答
反對(duì) 回復(fù) 2021-08-16
  • 2 回答
  • 0 關(guān)注
  • 239 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)