代码之家  ›  专栏  ›  技术社区  ›  nathan

Ruby线程的派生类?

  •  8
  • nathan  · 技术社区  · 15 年前

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

    Thread.new { <some block> }
    

    这样做会不对吗?

    class MyThread < Thread
      def initialize
      end
    
      def run
        <main loop>
      end
    
    5 回复  |  直到 11 年前
        1
  •  9
  •   Chris McCauley    15 年前

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

    如果您希望扩展/增强线程的行为方式,比如添加调试或性能输出,那么您所做的不会有任何问题,但我认为这不是您想要的。

    您可能想在您的领域中用活动对象建模一些概念。在这种情况下,标准的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 ...
    
        2
  •  6
  •   James Thompson    15 年前

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

    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相同。但是,如果类线程是子类的,那么在该子类中调用start将不会调用子类的initialize方法。”

        3
  •  5
  •   sj26    11 年前

    我喜欢这样封装:

    class Threader
      def initialize
        @thread = Thread.new(&method(:thread))
      end
    
    private
    
      def thread
        # Do thready things...
      end
    end
    

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

    class ThreadyThread < Thread
      def initialize
        super(&method(:thread))
      end
    
    private
    
      def thread
        # Do thready things...
      end
    end
    
        4
  •  1
  •   micmoo    15 年前

    线程Ruby文档提到“如果线程是子类的”,所以它看起来应该是好的。确保如果覆盖初始化,则调用super!

        5
  •  0
  •   Ben Hughes    15 年前

    它不是真正的Ruby方式,但它取决于您试图用线程完成什么。

    首先,Ruby1.8没有真正的线程,所以它们只对IO绑定的东西有用。

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

    继承是一种关系