3 回答

TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個(gè)贊
我遇到了同樣的問題(可能是不同的情況或設(shè)置)并以不同的方式修復(fù)它:
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它將在函數(shù)返回時(shí)執(zhí)行,這可能需要一段時(shí)間 - 取決于循環(huán)大?。▔闹饕猓?。所以只要做明確(更好的主意)

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

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個(gè)贊
OP 沒有提供最小的、可重現(xiàn)的示例。有問題的錯(cuò)誤是由未發(fā)布的代碼引起的。演示這一點(diǎn)的一種簡單方法是簡單地在一個(gè)最小示例中運(yùn)行提供的代碼(沒有其他活動(dòng)),并查看它沒有失敗。
函數(shù)ioutil.ReadFile當(dāng)然會(huì)關(guān)閉文件。在這種情況下,它被牽連,只是因?yàn)樗噲D在已經(jīng)達(dá)到資源限制時(shí)打開一個(gè)新文件。
Go 中的一個(gè)常見問題是無法關(guān)閉隱式打開的流。這種情況的一個(gè)特定情況是在使用http庫的客戶端函數(shù)時(shí)打開了一個(gè)流。
示例:(1), (2)
客戶端完成后必須關(guān)閉響應(yīng)正文:
resp, err := http.Get("http://example.com/")
if err != nil {
// handle error
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
此類請求應(yīng)始終包括對 的調(diào)用Close,使用如上所示的形式。
可能還有其他類似的隱式流被打開的情況......
這是一個(gè)特別棘手的問題,因?yàn)閷τ诂嵥榈某绦颍肋h(yuǎn)不會(huì)知道其中的區(qū)別。直到您通過數(shù)百或數(shù)千次迭代運(yùn)行此程序時(shí),您才會(huì)知道存在問題。然后,錯(cuò)誤通??赡鼙憩F(xiàn)為某些不相關(guān)的函數(shù)調(diào)用失敗——正如 OP 所展示的那樣。
- 3 回答
- 0 關(guān)注
- 277 瀏覽
添加回答
舉報(bào)