em-websocketで非同期処理(連続でサーバ側からクライアントにPushする)

EventMachine::WebSocket.start(host: "0.0.0.0", port: 3000) do |ws|
〜〜
sleep(1)
msg = ”test1”
ws.send(msg)
sleep(1)
msg = ”test2”
ws.send(msg)
sleep(1)
msg = ”test3”
ws.send(msg)

〜〜
end

というコードを書き、1秒毎にサーバ側がmsgをブラウザに送ることを期待したのですが、このコードでは、3秒後に3つのメッセージが同時に送信されます。

これを解決するためにEventMachine::deferを使います。
deferはその中で新しいスレッドを立て、非同期処理をしてくれる優れものです。


直したコードはこちら

EventMachine::WebSocket.start(host: "0.0.0.0", port: 3000) do |ws|
〜〜
EventMachine::defer do
  sleep(1)
  msg = ”test1”
  ws.send(msg)
  sleep(1)
  msg = ”test2”
  ws.send(msg)
  sleep(1)
  msg = ”test3”
  ws.send(msg)
end
〜〜
end

参考文献
橋本商会