2011-11-05 26 views
9

Vì vậy, tôi có một mảng 40000 phần tử và tôi muốn chạy một phương thức trên mỗi phần tử.Ruby - làm cách nào để chạy một phương thức trên mỗi phần tử mảng trên các luồng khác nhau?

Để giảm thời gian cần thiết, tôi đang nghĩ đến việc chạy tính năng này trên nhiều chuỗi. Có lẽ chia mảng thành nhiều mảng và chạy trên một chuỗi khác hoặc một thứ gì đó. Nhưng tôi không biết bắt đầu như thế nào.

Nói mảng là foo [] và phương thức gọi là thanh(). bar() trả về một chuỗi. Sau khi mã thực hiện, tôi muốn có thể kết hợp/thêm tất cả các chuỗi lại với nhau trong một chuỗi lớn.

Có cách nào để thực hiện việc này không? Tôi đã cố gắng giữ cho câu hỏi của mình càng đơn giản càng tốt, nhưng nếu bạn muốn biết thêm thông tin, hãy cho tôi biết.

Cảm ơn trước!

Trả lời

1

Nếu tôi đúng hiểu, bạn cần một cái gì đó giống như đoạn này:

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"] 
3

Có vẻ như bạn muốn một cái gì đó giống như một chức năng pmap. Có một thư viện ruby ​​có tên là peach cung cấp cả phương thức pmap và phương thức đào ("song song") trên các mảng gốc.

Với thư viện này, bạn có thể làm điều gì đó như

require 'peach' 
[1,2,3,4].pmap{|x| f(x)} #Spawns 4 threads, => [f(1),f(2),f(3),f(4)] 
+2

Có lẽ đáng nói rằng 'a.pmap (n) {...}' có thể được sử dụng để giới hạn mình để chỉ 'đề n', máy tính Gbert90 của lẽ sẽ nhận được khó chịu với anh ta nếu anh ta cố gắng khởi động 40k chủ đề. –

+0

Tôi đã thử điều này, nhưng nó không hoạt động cho một mảng lớn. Có bài viết/cuốn sách nào có thể trợ giúp về điều này không? – Gbert90

+0

Làm thế nào lớn mảng của bạn? Bạn đã thử giới hạn số lượng đề xuất như được đề xuất trong chú thích ở trên với 'a.pmap (n) {...}'? Chỉ cần chắc chắn hơn n <= # của cpu trong hệ thống của bạn. – drsnyder

3

Có rất nhiều cách để đạt được đồng thời, và sử dụng đề là một cách. Tuy nhiên, hiệu suất tốt nhất phụ thuộc vào thời gian chạy Ruby bạn chọn.

Ví dụ: một cách đơn giản để đa luồng là thư viện 'đào' (song song mỗi) http://peach.rubyforge.org/. Tuy nhiên, điều này làm việc tốt nhất trên JRuby, trong đó sử dụng chủ đề bản địa.

Đối với thời gian chạy MRI, bạn có thể muốn sử dụng nhiều quy trình như DRb hoặc một xe buýt thông báo như RabbitMQ.

Đối với một writeup lớn đến nhiều lựa chọn, xem bài này: http://merbist.com/2011/02/22/concurrency-in-ruby-explained/

0

Một lựa chọn khác là sử dụng Eventmachine, cho phép bạn chạy 'giả song song' trên một chủ đề duy nhất. Xem EM::Iterator - ví dụ:

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 
Các vấn đề liên quan