"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
答案 0 :(得分:4)
默认情况下,EventMachine是单线程的,所以除非你引入线程,否则确实不应该有任何竞争条件。
事件循环模型意味着您以快速顺序执行小而简单的操作,而不是需要自己的线程的长,阻塞方法。因此,您永远不应该有两段代码并行执行。
您有责任在您定义的点频繁地控制事件循环。