How can I return a value from a thread in Ruby?

后端 未结 5 1100
清歌不尽
清歌不尽 2021-02-03 19:08

If I have the following code :

threads = []
(1..5).each do |i|
  threads << Thread.new { `process x#{i}.bin` } 
end
threads.each do |t|
  t.join
  # i\'d l         


        
相关标签:
5条回答
  • 2021-02-03 19:39

    I found it simpler to use collect to collect the Threads into a list, and use thread.value to join and return the value from the thread - this trims it down to:

    #!/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
    

    When run, this produces:

    Hi from thread #1
    Hi from thread #2
    Hi from thread #3
    Hi from thread #4
    Hi from thread #5
    
    0 讨论(0)
  • 2021-02-03 19:40

    The script

    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
    

    illustrates how to accomplish what you need. It has the benefit of keeping the output with the thread that generated it, so you can join and get the output of each thread at any time. When run, the script prints

    Hi from thread #1
    Hi from thread #2
    Hi from thread #3
    Hi from thread #4
    Hi from thread #5
    
    0 讨论(0)
  • 2021-02-03 19:53

    This is a simple, and interesting way to use Thread#value:

    a, b, c = [
      Thread.new { "something" },
      Thread.new { "something else" },
      Thread.new { "what?" }
    ].map(&:value)
    
    a # => "something"
    b # => "something else"
    c # => "what?"
    
    0 讨论(0)
  • 2021-02-03 19:54

    Just use Thread#value:

    threads = (1..5).collect do |i|
      Thread.new { `echo x#{i}.bin` }
    end
    threads.each do |t|
      puts t.value
    end
    
    0 讨论(0)
  • 2021-02-03 19:58

    You should use the Queue class. Each thread should put its result in the queue, and the main thread should fetch it from there. Notice that using that approach, results my be in a order different from thread creation order in the queue.

    0 讨论(0)
提交回复
热议问题