Ruby Thread的派生类?

时间:2009-06-27 17:20:54

标签: ruby multithreading

我已经在C ++世界生活多年了,我刚开始使用Ruby。我有一个班级,我想做一个线程。在Ruby中从Thread派生类是错误的吗?我看到的例子使用了以下概念。

Thread.new { <some block> }

这样做会不对吗?

class MyThread < Thread
  def initialize
  end

  def run
    <main loop>
  end

5 个答案:

答案 0 :(得分:9)

我认为这确实是关于域建模的问题。

如果你想扩展/增强线程的行为方式,那么你正在做的事情没有任何问题 - 例如添加调试或性能输出,但我认为这不是你想要的。

您可能希望使用活动对象在域中为某些概念建模。在这种情况下,标准的Ruby方法更好,因为它允许您在不弯曲域模型的情况下实现此目的。

继承确实只应用于建模IS_A关系。这个标准的ruby代码整齐地包含了解决方案。

要使对象处于活动状态,请让它以某种方法捕获新创建的线程

Class MyClass

...


   def run
      while work_to_be_done do
         some_work
      end
   end

...

end


threads = []

# start creating active objects by creating an object and assigning
# a thread to each

threads << Thread.new { MyClass.new.run }

threads << Thread.new { MyOtherClass.new.run }

... do more stuff

# now we're done just wait for all objects to finish ....

threads.each { |t| t.join }


# ok, everyone is done, see starships on fire off the shoulder of etc
# time to die ...

答案 1 :(得分:6)

这很好,我见过人们之前这样做过。以下是调用Thread.new时运行的Ruby邮件列表中的一些示例代码:

class MyThread < Thread
  def initialize
    super("purple monkey dishwasher") {|str| puts "She said, '#{str}.'"}
  end
end

如果您计划调用Thread.fork或Thread.start来运行您的线程,您应该从Ruby documentation those methods了解这一点:

“与Thread :: new基本相同。但是,如果类是Thread子类,那么在该子类中调用start将不会调用子类的initialize方法。”

答案 2 :(得分:5)

我更喜欢这样封装:

class Threader
  def initialize
    @thread = Thread.new(&method(:thread))
  end

private

  def thread
    # Do thready things...
  end
end

您也可以直接对Thread子类执行此操作:

class ThreadyThread < Thread
  def initialize
    super(&method(:thread))
  end

private

  def thread
    # Do thready things...
  end
end

答案 3 :(得分:1)

线程Ruby文档提到“如果线程是子类”,所以看起来应该没问题。确保你的覆盖初始化,你打电话给超级!

答案 4 :(得分:0)

这不是真正的红宝石方式,但这取决于你想用线程完成的事情。

首先,ruby 1.8并没有真正的线程,所以它们只对IO绑定的东西非常有用。

通常在ruby中,您希望某些东西在线程中执行操作而不是代表线程,因此更容易定义一个在内部创建线程来处理线程方面的普通类。

继承是一种IS_A关系