2012-02-22 4 views
2

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

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 

ответ

4

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

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

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

Смежные вопросы