Re: [閒聊] python有些很奇怪的地方...

看板Python作者 (金が信念! XD)時間19年前 (2006/01/09 04:12), 編輯推噓2(201)
留言3則, 2人參與, 最新討論串6/6 (看更多)
※ 引述《huggie (huggie)》之銘言: : ※ 引述《Leland (報廢機器人的傳說)》之銘言: : : 我不確定這樣 out of scope 會不會被 garbage collect 耶, : : 就算會我也不知道會不會自己 close 掉。 : 我剛剛在 Linux 上面做了一點小測試 : fd = [] : while 1: : fd.append(open('data', 'r')) : 幾乎在我按下 enter 執行的同時就會發現已經超過系統負荷了: : usa:/home/thw/diginorth/dbEST# ./test.py : Traceback (most recent call last): : File "./test.py", line 7, in ? : IOError: [Errno 24] Too many open files: 'data' : 但如果是... : while 1: : fd = open('data', 'r') : 或者是 : while 1: : for line in open('data', 'r'): : pass : 就會跑不完,因此我猜 garbage collection 把 fd 清除後會關檔 這是當然的, 因為 __builtin__.open 所傳回來的東西是一個 file object, 基本上底層所謂開檔關檔或 file descriptor 什麼的, 對外面來講必須是透明的(也就是說你看不見啦), 理所當然底層的 fd 生命期應該由該 file object 管理才合理. 順道一提的是, python 的 garbage collector 有兩種演算法, reference counting 跟 object reachability, 前者當某個 object 的 refcount 降到 0 的時候會立即觸發, (這回答了 Leland 的問題, 那樣的 out of scope 會立即引發 gc.) 而後者則是要等系統的資源壓力到了某個門檻值才會觸發, 方法是由 global namespace 做 DFS traverse, 紀錄所有經過的 object, 然後把那些摸不到的 object 清掉. 也就是說以下這種的 out of scope 就不會立即被觸發. while 1: fd = [open('data', 'r')] fd.append(fd) 這個程式就很有趣, 如果在系統的 fd quota 用完前 gc 就先觸發了, 那這個程式可以永遠跑下去, 但如果系統給的 fd quota 比 gc threshold 還緊, 那就會發生 I/O error. :p -- その乾いた哀愁の瞳に去來するものは何か? 失ったもの 得たもの そして廣大なネットの狹間で彼が見たものとは? 虛像と實存と記號の中に彼は今、何を想うのか? <バトルプログラマーシラセ> -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.109.224.64

01/09 08:49, , 1F
大部份的 gc 都會用 ref. count 來作吧?? (e.g., Java)
01/09 08:49, 1F

01/09 16:48, , 2F
SICP 裡面講的 gc 不是用 ref count,
01/09 16:48, 2F

01/09 16:49, , 3F
我想應該至少有些 scheme 用的是 SICP 講的那種
01/09 16:49, 3F
文章代碼(AID): #13mN99It (Python)
文章代碼(AID): #13mN99It (Python)