Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby-如何在不同线程上的每个数组元素上运行方法?_Ruby_Arrays_Multithreading - Fatal编程技术网

Ruby-如何在不同线程上的每个数组元素上运行方法?

Ruby-如何在不同线程上的每个数组元素上运行方法?,ruby,arrays,multithreading,Ruby,Arrays,Multithreading,所以我有一个40000个元素的数组,我希望在每个元素上运行一个方法 为了减少所需的时间,我正在考虑在多个线程上运行它。可能是将数组拆分为多个数组并在不同的线程上运行。但我不知道如何开始 假设数组是foo[],要调用的方法是bar()。返回一个字符串。代码执行后,我希望能够将所有字符串组合/相加到一个大字符串中 有办法做到这一点吗?我试图让我的问题尽可能简单,但如果你想了解更多信息,请告诉我 提前谢谢 如果我理解正确,您需要这样的代码片段: foo = %w{1 2 3} # => ["1

所以我有一个40000个元素的数组,我希望在每个元素上运行一个方法

为了减少所需的时间,我正在考虑在多个线程上运行它。可能是将数组拆分为多个数组并在不同的线程上运行。但我不知道如何开始

假设数组是foo[],要调用的方法是bar()。返回一个字符串。代码执行后,我希望能够将所有字符串组合/相加到一个大字符串中

有办法做到这一点吗?我试图让我的问题尽可能简单,但如果你想了解更多信息,请告诉我


提前谢谢

如果我理解正确,您需要这样的代码片段:

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){…}
限制上述注释中建议的线程数?只需确保