作者Freak1033 (金が信念! XD)
看板Python
标题Re: [闲聊] python有些很奇怪的地方...
时间Mon Jan 9 04:29:08 2006
※ 引述《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
1F:推 ericsk:大部份的 gc 都会用 ref. count 来作吧?? (e.g., Java) 01/09 08:49
2F:推 Leland:SICP 里面讲的 gc 不是用 ref count, 01/09 16:48
3F:→ Leland:我想应该至少有些 scheme 用的是 SICP 讲的那种 01/09 16:49