亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang中打開文件過多錯誤

Golang中打開文件過多錯誤

Go
胡子哥哥 2022-01-17 18:10:50
我只是在閱讀/proc/diskstats文件。我的代碼是:func ReadFromFile(filepath string)(string){    defer func() {        if err1 := recover(); err1 != nil {            fmt.Println("!!!!!!!!!!!!!!!!Panic Occured and Recovered in readFromFile(), Error Info: ", err1)        }     }()    strData := ""    data, err := ioutil.ReadFile(filepath)    if err != nil{        fmt.Println("File read error: ", err)        return ""    }    strData = string(data)    return strData}我得到的錯誤是:File read error: open /proc/diskstats: too many open files不僅對于這個文件,我對其他一些文件也遇到了同樣的錯誤。我也運行了這個命令:root@golang:~# lsof|wc -l785請指導我。
查看完整描述

3 回答

?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

我遇到了同樣的問題(可能是不同的情況或設置)并以不同的方式修復它:


func some_func(file_name []string) {

    for _, file_name := range file_names {

        f, _ := os.Create(file_name)

        // defer f.Close() // bad idea

        _, _ = f.Write([]byte("some text"))

        f.Close() // better idea

    }

}

問題是defer它將在函數返回時執行,這可能需要一段時間 - 取決于循環大?。▔闹饕猓?。所以只要做明確(更好的主意)


查看完整回答
反對 回復 2022-01-17
?
蕭十郎

TA貢獻1815條經驗 獲得超13個贊

基本上在 UNIX 平臺中,操作系統對進程在任何給定時間可能擁有的打開文件描述符的數量進行了限制。由于您已達到當前打開的文件(和/或管道或套接字)的限制,并且您正在嘗試打開一個新文件(和/或管道或套接字),因此引發了
錯誤。 為避免此問題,您必須在完成使用打開的文件后關閉文件too many open files
Close()

查看完整回答
反對 回復 2022-01-17
?
SMILET

TA貢獻1796條經驗 獲得超4個贊

OP 沒有提供最小的、可重現的示例。有問題的錯誤是由未發布的代碼引起的。演示這一點的一種簡單方法是簡單地在一個最小示例中運行提供的代碼(沒有其他活動),并查看它沒有失敗。


函數ioutil.ReadFile當然會關閉文件。在這種情況下,它被牽連,只是因為它試圖在已經達到資源限制時打開一個新文件。


Go 中的一個常見問題是無法關閉隱式打開的流。這種情況的一個特定情況是在使用http庫的客戶端函數時打開了一個流。


示例:(1), (2)


客戶端完成后必須關閉響應正文:


resp, err := http.Get("http://example.com/")

if err != nil {

    // handle error

}

defer resp.Body.Close()

body, err := ioutil.ReadAll(resp.Body)

此類請求應始終包括對 的調用Close,使用如上所示的形式。


可能還有其他類似的隱式流被打開的情況......


這是一個特別棘手的問題,因為對于瑣碎的程序,您永遠不會知道其中的區別。直到您通過數百或數千次迭代運行此程序時,您才會知道存在問題。然后,錯誤通??赡鼙憩F為某些不相關的函數調用失敗——正如 OP 所展示的那樣。


查看完整回答
反對 回復 2022-01-17
  • 3 回答
  • 0 關注
  • 290 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號