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

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

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 所展示的那樣。
- 3 回答
- 0 關注
- 290 瀏覽
添加回答
舉報