繁体   English   中英

如何使用 ruby​​ 中的线程在类中运行方法?

[英]How do I run a method inside of a class with thread from ruby?

我在那里有一个类和属性

class Person
  attr_accessor :name
  def say_hello
   puts "person name #{self.name} "
  end
end

现在我想执行方法 say_hello 但使用这个线程

queue_thread= []
1..100.times do |number|
  person= Person.new
  person.name= number.to_s
   thread_to_run=Thread.new {person.say_hello}
   queue_thread << thread_to_run
end
queue_thread.map {|thread_current| thread_current.join}

你知道怎么做吗? 我看了看,问题是线程不能通过对象实例识别变量。

正确的答案应该是控制台中的这个

"person name 1"
"person name 2"
"person name ..."
"person name etc"

这段代码的问题在于它在调用join之前触发了多个线程——此时,由于线程的异步性质,某些线程可能会以不正确的顺序调用。

一种选择是在调用线程后立即join 这实际上会暂停迭代直到线程完成,所以你知道它们会保持有序:

100.times do |number|
  person= Person.new
  person.name= number.to_s
  Thread.new {person.say_hello}.join
end

请注意,在这里使用线程确实没有意义,但它至少会表明您可以join作品。

另一种选择(也不必要地使用线程)是通过将其存储为 lambda 来延迟线程调用。 这基本上是同一件事,但允许您将其拆分为两个迭代:

queue_threads= []
1..100.times do |number|
  person= Person.new
  person.name= number.to_s
  thread_lambda = -> { Thread.new {person.say_hello} }
  queue_threads.push(thread_lambda)
end
queue_threads.map {|thread_lambda| thread_lambda.call.join}

另请注意, 1..100.times并没有按照您的想法行事。 这与说100.times是一样的,因此,例如,如果您说99..100.times ,则 99 将被忽略,这将是 100 次迭代,而不仅仅是 1 次。如果您想在一个范围内进行迭代,你可以使用类似99..100.each do |i| .

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM