2009-09-05 45 views
26

Nếu tôi có đoạn mã sau:Làm thế nào tôi có thể trả về một giá trị từ một chuỗi trong Ruby?

threads = [] 
(1..5).each do |i| 
    threads << Thread.new { `process x#{i}.bin` } 
end 
threads.each do |t| 
    t.join 
    # i'd like to get the output of the process command now. 
end 

gì làm tôi phải làm gì để nhận được đầu ra của lệnh quá trình? Làm thế nào tôi có thể tạo một chủ đề tùy chỉnh để tôi có thể thực hiện điều này?

Trả lời

42

Kịch bản

threads = [] 
(1..5).each do |i| 
    threads << Thread.new { Thread.current[:output] = `echo Hi from thread ##{i}` } 
end 
threads.each do |t| 
    t.join 
    puts t[:output] 
end 

minh họa làm thế nào để thực hiện những gì bạn cần. Nó có lợi ích của việc giữ đầu ra với các chủ đề mà tạo ra nó, vì vậy bạn có thể tham gia và nhận được đầu ra của mỗi chủ đề bất cứ lúc nào. Khi chạy, các bản in kịch bản

 
Hi from thread #1 
Hi from thread #2 
Hi from thread #3 
Hi from thread #4 
Hi from thread #5 
+0

Vinay, có thể bạn cũng có thể xem xét điều này: http://stackoverflow.com/questions/1383470/why-is-this-running-like-it-isnt-threaded – Geo

+2

Đẹp hơn rất đơn giản để trả lại kết quả từ thread và use 'puts t.value' – Yacoby

3

Bạn nên sử dụng lớp Queue. Mỗi luồng sẽ đặt kết quả của nó trong hàng đợi và chuỗi chính sẽ lấy nó từ đó. Lưu ý rằng khi sử dụng phương pháp đó, kết quả của tôi theo thứ tự khác với thứ tự tạo chuỗi trong hàng đợi.

+2

Lớp Queue rất hữu ích, nhưng không cần thiết cho trường hợp của áp phích gốc, khi không có tranh chấp chủ đề trên một giá trị hoặc tập hợp các giá trị. Vì vậy, người dân địa phương thread đủ trong trường hợp này. – sheldonh

25

tôi thấy nó đơn giản để sử dụng thu thập để thu thập các Chủ đề vào một danh sách, và sử dụng thread.value tham gia và trả về giá trị từ thread - đây Trims nó xuống:

#!/usr/bin/env ruby 
threads = (1..5).collect do |i| 
    Thread.new { `echo Hi from thread ##{i}` } 
end 
threads.each do |t| 
    puts t.value 
end 

Khi chạy, điều này tạo ra:

Hi from thread #1 
Hi from thread #2 
Hi from thread #3 
Hi from thread #4 
Hi from thread #5 
+0

Nó hoạt động cho tôi! :) – debbie

2

Chỉ cần sử dụng Thread#value:

threads = (1..5).collect do |i| 
    Thread.new { `echo x#{i}.bin` } 
end 
threads.each do |t| 
    puts t.value 
end 
7

Đây là cách đơn giản và thú vị để sử dụng #value() với #join() để truy xuất giá trị từ Mảng đề tài.

a, b, c = [ 
    Thread.new { "something" }, 
    Thread.new { "something else" }, 
    Thread.new { "what?" } 
].map(&:join).map(&:value) 

puts a.inspect 
puts b.inspect 
puts c.inspect 
Các vấn đề liên quan