发送到EventMachine循环之外

时间:2012-11-18 19:48:42

标签: ruby websocket eventmachine

我正在使用em-ws-client宝石,虽然我认为我的问题比这更普遍。我正在尝试从EventMachine接收块外部发送数据,但是要发送数据需要很长时间(~20秒):

require "em-ws-client"

m = Mutex.new
c = ConditionVariable.new

Thread.new do
  EM.run do
    @ws = EM::WebSocketClient.new("ws://echo.websocket.org")

    @ws.onopen do
      puts "connected"
      m.synchronize { c.broadcast }
    end

    @ws.onmessage do |msg, binary|
      puts msg
    end
  end
end

m.synchronize { c.wait(m) }

@ws.send_message "test"

sleep 100

当我将@ws.send_message "test"直接放入onopen方法时,它可以正常工作。我不明白为什么我的版本不起作用。我在EventMachine中找到this issue,但我不确定它是否相关。

为什么需要这么长时间,我该如何解决?

1 个答案:

答案 0 :(得分:1)

EventMachine是严格单线程的,不建议在线程之间共享套接字。你可能在这里看到的是一个问题,主要的EventMachine线程没有意识到你已经提交了send_message电话并将其保留了很长一段时间。

在使用带有EventMachine的线程时,我会非常非常小心。如果您遇到线程计时或同步问题,我已经看到它出现故障并崩溃。