0

我正在使用em-ws-clientgem,尽管我认为我的问题比这更笼统。我正在尝试从 EventMachine 接收块外部发送数据,但是发送数据需要很长时间(~20s):

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 中发现了这个问题,但我不确定它是否相关。

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

4

1 回答 1

1

EventMachine 是严格的单线程,不建议在线程之间共享套接字。您可能会在这里看到一个问题,即主 EventMachine 线程不知道您已经提交了一个send_message调用并将其缓冲了很长一段时间。

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

于 2012-11-18T20:07:58.810 回答