From: Tanaka Akira Date: 2005-12-29T22:58:11+09:00 Subject: [ruby-dev:28174] Re: thread based generator.rb In article , nobuyoshi nakada writes: > うーん、こんなところかな。 いいんじゃないかと思います。 % ./ruby -rgenerator -e ' n = 0 while true File.foreach("/proc/self/status") {|line| puts line if /VmSize:/ =~ line } if (n += 1) % 100 == 0 g = Generator.new { |g| g.yield 1 } GC.start end ' VmSize: 3472 kB VmSize: 4352 kB VmSize: 4744 kB VmSize: 5140 kB VmSize: 5524 kB VmSize: 6052 kB VmSize: 6448 kB .... というようにメモり使用量が増えていったのが、 % ./ruby -rgenerator -e ' n = 0 while true File.foreach("/proc/self/status") {|line| puts line if /VmSize:/ =~ line } if (n += 1) % 100 == 0 g = Generator.new { |g| g.yield 1 } GC.start end ' VmSize: 3080 kB VmSize: 3212 kB VmSize: 3212 kB VmSize: 3212 kB VmSize: 3212 kB VmSize: 3212 kB VmSize: 3212 kB VmSize: 3212 kB VmSize: 3212 kB VmSize: 3212 kB .... というように一定となり、また、 % ./ruby -e ' Thread.new { begin Thread.stop ensure p Thread.current end } Thread.new { begin Thread.stop ensure p Thread.current end } Thread.new { begin Thread.stop ensure p Thread.current end } Thread.new { begin Thread.stop ensure p Thread.current end } Thread.new { begin Thread.stop ensure p Thread.current end } GC.start Thread.pass p :main ' :main # # # # # というように使われなくなったスレッドの ensure がプロセス終了 時に起動していたのが、 % ./ruby -e ' Thread.new { begin Thread.stop ensure p Thread.current end } Thread.new { begin Thread.stop ensure p Thread.current end } Thread.new { begin Thread.stop ensure p Thread.current end } Thread.new { begin Thread.stop ensure p Thread.current end } Thread.new { begin Thread.stop ensure p Thread.current end } GC.start Thread.pass p :main ' # # # # :main # というように、main thread が終わる前に GC によって ensure が 動くのが観察できました。 -- [田中 哲][たなか あきら][Tanaka Akira]