我正在使用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,但我不确定它是否相关。
为什么需要这么长时间,我该如何解决?
答案 0 :(得分:1)
EventMachine是严格单线程的,不建议在线程之间共享套接字。你可能在这里看到的是一个问题,主要的EventMachine线程没有意识到你已经提交了send_message
电话并将其保留了很长一段时间。
在使用带有EventMachine的线程时,我会非常非常小心。如果您遇到线程计时或同步问题,我已经看到它出现故障并崩溃。