一些庫有一些記憶體泄漏,作為一個簡單的解決方案,我只想經常重啟我的腳本。我的腳本做了一些長時間的計算,但我可以保存狀態然后再次加載它,所以重新啟動它不是問題。
為了重新啟動,我只是在使用os.execv:
os.execv(sys.executable, [sys.executable] sys.argv)
但是,現在過了一會兒,我得到了Too many open files.
這是為什么?據我所知,所有檔案描述符(fds)都應該在之后關閉exec?我以為我們總是設定了 close-on-exec 標志?但也許不是?或者也許不是所有的圖書館?也許我誤解了檔案。有人可以澄清一下嗎?
我將如何在 之前關閉所有 fds exec?os.closerange? 也許只是:
max_fd = os.sysconf("SC_OPEN_MAX")
os.closerange(3, max_fd)
os.execv(sys.executable, [sys.executable] sys.argv)
那這樣可以正常作業嗎?
還有哪些其他簡單的重啟解決方案?我假設 fork exec exit 會有同樣的問題嗎?還是生成 退出?
uj5u.com熱心網友回復:
os.execv本身不會關閉任何檔案描述符。(想一想:如果exec系統呼叫關閉檔案描述符,標準 fork exec 模型將無法將標準輸入、標準輸出和標準錯誤傳遞給新行程。)檔案隱含地提到了這一點,因為它說明flush在呼叫os.execv.
就像您描述的那樣,PEP-446為 Python 本身創建的大多數檔案描述符實作了 close-on-exec 。如果無法訪問您的代碼,我們只能推斷您的代碼創建的某些檔案描述符超出了 PEP 的范圍(或由您創建的os.dup2(),您可以在其中控制行為,但默認設定是使檔案描述符可繼承)。
您的os.closerange代碼應該適用于您的要求。如果您想更精確,請檢查 Python 中打開了哪些檔案,了解如何找出打開了哪些檔案(這對于解決根本原因可能很有用,即使您最終使用該closerange解決方案來修復當前問題)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/480493.html
