Происходят ли условия гонки в EventMachine? - PullRequest
2 голосов
/ 22 февраля 2012

Блокируется ли "run" как единое целое в EM (без переключения контекста)? И в этом примере, будет ли условие гонки в предложении if?

EventMachine.run {
  @current_value = 0
  EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 8080, :debug => true) do |ws|
    ws.onopen {
      @current_value += 1
      if @current_value >= 4 # Race condition?
        # Code Block
        @current_value = 0
      end

      ws.onmessage { |msg|
        # puts msg
      }

      ws.onclose {
        # puts "disconnected"
      }
    }  
  end
end

1 Ответ

4 голосов
/ 22 февраля 2012

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

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

Вы несете ответственность за частое управление циклом событий в определенных вами точках.

...