Ruby-如何在不同线程上的每个数组元素上运行方法?
所以我有一个40000个元素的数组,我希望在每个元素上运行一个方法 为了减少所需的时间,我正在考虑在多个线程上运行它。可能是将数组拆分为多个数组并在不同的线程上运行。但我不知道如何开始 假设数组是foo[],要调用的方法是bar()。返回一个字符串。代码执行后,我希望能够将所有字符串组合/相加到一个大字符串中 有办法做到这一点吗?我试图让我的问题尽可能简单,但如果你想了解更多信息,请告诉我Ruby-如何在不同线程上的每个数组元素上运行方法?,ruby,arrays,multithreading,Ruby,Arrays,Multithreading,所以我有一个40000个元素的数组,我希望在每个元素上运行一个方法 为了减少所需的时间,我正在考虑在多个线程上运行它。可能是将数组拆分为多个数组并在不同的线程上运行。但我不知道如何开始 假设数组是foo[],要调用的方法是bar()。返回一个字符串。代码执行后,我希望能够将所有字符串组合/相加到一个大字符串中 有办法做到这一点吗?我试图让我的问题尽可能简单,但如果你想了解更多信息,请告诉我 提前谢谢 如果我理解正确,您需要这样的代码片段: foo = %w{1 2 3} # => ["1
提前谢谢 如果我理解正确,您需要这样的代码片段:
foo = %w{1 2 3} # => ["1", "2", "3"]
# in your case it would be some time-consumed operation on string
def inc(element)
element.succ
end # => nil
inc("1") # => "2"
threads = foo.map do |f|
Thread.new { inc(f) }
end
# => [#<Thread:0x8d28694 run>, #<Thread:0x8d28630 run>, #<Thread:0x8d28590 run>]
threads.map { |t| t.value } # => ["2", "3", "4"]
foo=%w{1 2 3}#=>[“1”、“2”、“3”]
#在您的情况下,对字符串执行操作需要花费一些时间
def公司(要素)
元素成功
结束#=>零
公司(“1”)#=>“2”
线程=foo.map do | f|
Thread.new{inc(f)}
结束
# => [#, #, #]
threads.map{| t | t.value}#=>[“2”、“3”、“4”]
听起来您需要类似于pmap功能的功能。有一个名为的ruby库,它在本机数组上提供了pmap和peach(“并行”每个)方法
使用此库,您可以执行以下操作
require 'peach'
[1,2,3,4].pmap{|x| f(x)} #Spawns 4 threads, => [f(1),f(2),f(3),f(4)]
实现并发的方法有很多,使用线程是一种方法。但是,最佳性能取决于您选择的Ruby运行时 例如,多线程的一种简单方法是“peach”(parallel each)库。然而,这在使用本机线程的JRuby上效果最好 对于MRI运行时,您可能希望使用多个进程,如或消息总线
有关许多选项的详细说明,请参阅本文:另一个选项是使用Eventmachine,它允许您在单个线程上运行“伪并行”。见-例如:
ret = nil
EM.run do
# run 10 at a time; you can set the concurrency level to whatever you want
# but processing will slow down depending on how costly your bar method is
EM::Iterator.new(foo, 10).map(
proc{|item, iter| iter.return(item.bar)},
proc{|results| ret = results.join; EM.stop}
)
end
可能值得一提的是,
a.pmap(n){…}
可以用来限制自己只使用n
线程,如果Gbert90试图启动40k线程,它的计算机可能会对它感到不安。我尝试过这个,但它对大型数组不起作用。是否有任何文章/书籍可以对此有所帮助?您的阵列有多大?您是否尝试过使用a.pmap(n){…}
限制上述注释中建议的线程数?只需确保