Ruby Multithreading: заставить один поток ждать сигнала от другого - PullRequest
2 голосов
/ 30 марта 2010

В Ruby я хочу, чтобы два потока работали одновременно, и хочу, чтобы фоновый поток периодически сигнализировал потоку переднего плана.Как заставить поток переднего плана блокироваться, пока фоновый поток не скажет 'go'?Я могу придумать несколько способов сделать это, но мне нужен наиболее подходящий идиоматический метод Ruby.

В коде:

loop do  # background, thread 1
  sleep 3
  receive_input
  tell_foreground_input_is_ready # <-- how do I do this?
end

и

loop do  # foreground, thread 2
  wait_for_signal_from_background  # <-- how do I do this?
  do_something
end

(примечание: фон может сигнализировать несколько раз на переднем плане. каждый раз, когда передний план завершает ожидание, он сбрасывает отставание.)

Ответы [ 3 ]

1 голос
/ 30 марта 2010

Оказывается, это прекрасно работает:

require 'thread'
queue = Queue.new
Thread.new do
  100.times do |i|
    sleep 1
    queue.enq i
  end
end

loop do
  print "waiting... "
  puts queue.deq      # this function blocks.
end
1 голос
/ 30 марта 2010

Вы хотите использовать условные переменные и мьютексы согласно этой странице

0 голосов
/ 27 февраля 2014

Вот чистая и краткая реализация: http://emptysqua.re/blog/an-event-synchronization-primitive-for-ruby/

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