我如何 运行 class 中的方法与来自 ruby 的线程?
How do I run a method inside of a class with thread from ruby?
我有一个 class 和那里的属性
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|
.
我有一个 class 和那里的属性
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|
.