我们说我有以下网址列表:
urls = ['socket1.com', 'socket2.com']
我设置了一个EventMachine Iterator来打开与这些套接字的连接
require 'websocket-eventmachine-client'
EM.run do
EM::Iterator.new(urls, urls.size).each do |url, iterator|
socket = WebSocket::EventMachine::Client.connect(uri: url)
socket.onopen {puts "open #{url}"}
socket.onmessage {|msg, type| puts msg}
socket.onclose {|code, reason| puts "closed #{url}"}
end
end
使用该代码,我认为如果需要,我可以添加到另一个URL的连接。 我需要做的是添加另一个连接,例如socket3.com,同时不影响其他连接。
有什么想法吗?
答案 0 :(得分:1)
我不确定EM Iterator是否是最好的工具,因为您希望在迭代它时可能添加到阵列中,这听起来不是很安全。从你的描述来看,听起来更像是你需要一个可以在添加新URL时响应的发布/订阅式队列。这样的事情可能有用(警告100%未经测试!):
class EMCallbackQueue
attr_accesor :callback
def push(item)
callback.call(item)
end
end
require 'websocket-eventmachine-client'
EM.run do
callback_queue = EMCallbackQueue.new
# Assign a proc to the callback, this will called when a new url is pushed on the Queue
callback_queue.callback = ->(url){
socket = WebSocket::EventMachine::Client.connect(uri: url)
socket.onopen {puts "open #{url}"}
socket.onmessage {|msg, type| puts msg}
# Maybe add to the callback queue from within a callback
# based on the msg from the current connection
callback_queue.push "additionsocket.com"
socket.onclose {|code, reason| puts "closed #{url}"}
}
callback_queue.push "socket1.com"
callback_queue.push "socket2.com"
end
EMCallbackQueue
只是回调过程的一个包装器,当附加新的url时,调用callback
proc,并且因为它全部在eventmachine中,所以WebSocket :: EventMachine: :客户端将在reactor循环的下一个tick上处理url,允许其余代码运行,这反过来将排队更多url。