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
参考文献
橋本商会