EventMachine会出现竞争条件吗?

时间:2012-02-22 15:10:47

标签: ruby eventmachine

"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 个答案:

答案 0 :(得分:4)

默认情况下,EventMachine是单线程的,所以除非你引入线程,否则确实不应该有任何竞争条件。

事件循环模型意味着您以快速顺序执行小而简单的操作,而不是需要自己的线程的长,阻塞方法。因此,您永远不应该有两段代码并行执行。

您有责任在您定义的点频繁地控制事件循环。