Re: [閒聊] python有些很奇怪的地方...
※ 引述《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
01/09 08:49, 1F
推
01/09 16:48, , 2F
01/09 16:48, 2F
→
01/09 16:49, , 3F
01/09 16:49, 3F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 6 之 6 篇):
Python 近期熱門文章
PTT數位生活區 即時熱門文章