2012-02-22 9 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は、デフォルトでは、シングルスレッドなので、あなたがスレッドを導入している場合を除き、本当にあらゆる競争条件があってはなりません。

イベントループモデルとは、独自のスレッドを必要とする長いブロッキングメソッドの代わりに、小さな単純なアクションを迅速な順序で実行することを意味します。したがって、2つのコードを並列に実行する必要はありません。

定義したポイントでイベントループを頻繁に制御するのはあなたの責任です。