Как я могу вернуть значение из потока в Ruby?

Вы можете использовать переменную в теге статического шаблона. Обратите внимание, что вам не нужны {{ или }}

{% static SampleModel.0.propertyValue %} 
29
задан Geo 5 September 2009 в 14:08
поделиться

5 ответов

Сценарий

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

иллюстрирует, как выполнить то, что вам нужно. Преимущество заключается в том, что выходные данные хранятся в потоке, который его сгенерировал, так что вы можете присоединиться и получить выходные данные каждого потока в любое время. При запуске скрипт печатает

Hi from thread #1
Hi from thread #2
Hi from thread #3
Hi from thread #4
Hi from thread #5
45
ответ дан Vinay Sajip 5 September 2009 в 14:08
поделиться

Вы должны использовать класс Queue . Каждый поток должен поместить свой результат в очередь, а основной поток должен получить его оттуда. Обратите внимание, что при таком подходе результаты могут быть в порядке, отличном от порядка создания потока в очереди.

2
ответ дан Martin v. Löwis 5 September 2009 в 14:08
поделиться

Это простой и интересный способ использования Thread # value :

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

a # => "something"
b # => "something else"
c # => "what?"
.
11
ответ дан siegy22 5 September 2009 в 14:08
поделиться

Я обнаружил, что проще использовать коллекцию для сбора потоков в список и использовать thread.value для объединения и возврата значения из потока - это сокращает его до:

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

При запуске , это производит:

Hi from thread #1
Hi from thread #2
Hi from thread #3
Hi from thread #4
Hi from thread #5
30
ответ дан iheggie 5 September 2009 в 14:08
поделиться

Просто используйте Thread#value:

threads = (1..5).collect do |i|
  Thread.new { `echo x#{i}.bin` }
end
threads.each do |t|
  puts t.value
end
3
ответ дан wedesoft 5 September 2009 в 14:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: