Ruby - 类开始一个线程从未被GC处理

时间:2017-01-28 15:42:36

标签: ruby multithreading garbage-collection

我是Ruby的新手,所以如果我错过了什么,我会道歉。我有一个类启动一个线程来执行一些内部缓存刷新。即使我加入线程并将其设置为nil,然后将所有类实例设置为nil,也不会处理该类。有没有人见过这个问题?我究竟做错了什么? 谢谢 丹尼尔

我的代表:

class KK
    def initialize()
      @thread = Thread.new(&method(:refresh_cache))      
      ObjectSpace.define_finalizer( self, self.class.finalize() )
    end

    def self.finalize()
      proc {       
        puts 'Object KK Disposed'
      }
    end

    def wait_thread
      puts 'join thread'
      @thread.join #also tried with exit and kill
      @thread=nil
    end

    def refresh_cache
          puts 'KK still here'    
    end    
end

puts 'started'

puts Thread.list

k2=KK.new
puts    ObjectSpace.each_object(KK).count

puts Thread.list
k2.wait_thread
k2=nil
puts 'After nil'
puts Thread.list

GC.start
sleep 5
#still one instance here
puts    ObjectSpace.each_object(KK).count

1 个答案:

答案 0 :(得分:0)

  1. &foo去了foo.to_proc
  2. &method(:bar)去了method(:bar).to_proc
  3. 符号查找必须检索method,这是从Object继承的实例方法,即它self.method(:bar).to_proc
  4. self.method生成一个绑定 Method,它可以使绑定的接收者(自己)保持活动状态,并且当包含在proc中时它会一直这样做。

    如果要将其转换为可以传递给线程而不保留实例的proc,则应该使用静态方法。