Ruby排列和线程

时间:2016-05-22 10:19:18

标签: ruby multithreading

我正在尝试计算["a".."z", "A".."Z", 0..9]和长度@perm的所有排列。因此,通过使用.lazy我在我的机器中减少了8GB内存7.5的内存使用量,但我仍然有一些问题/问题:

@perm = 4
@chars = [*"a".."z", *"A".."Z", *0..9]
@total_perm = @chars.size**@perm
@ips = 10000
@total_indexes = 0

@thr = []

puts "@total_perm: #{@total_perm}"

@chars.repeated_permutation(@perm).lazy.map(&:join).each_slice(@ips).with_index do |item, index|

  puts "=========> out_index: #{index}"

    @thr << Thread.new do
      begin
        item.each_with_index do |vitem, vindex|
          @total_indexes += 1
        end
      rescue ThreadError
      end
    end

end

@thr.each {|t| t.join }

puts "=========> total_indexes: #{@total_indexes}"
  1. 线程没有做他们应该做的事情 - 没有太多的性能提升如果我使用each_slice并将它们分割成10,000个项目的数组,那么为每个项目创建一个Thread。
  2. 内存使用率显着下降(7.5GB - > 45MB),但CPU使用率仍然很高。这有什么解决方案吗?也许动态限制其使用?

1 个答案:

答案 0 :(得分:1)

您可以阅读这篇文章Ruby concurrency and parallelism

总之,CRuby 1.9&gt; =线程不是'本机'(不是绿色),但由于GIL它们不能并行。 Rubinious和JRuby没有GIL,所以它是一个选项。其他选项是自己实现线程池或使用像EventMachine和Celluloid这样的宝石。