将另一个 URL 插入 WebSocket::EventMachine 迭代器
Insert another URL into WebSocket::EventMachine Iterator
假设我有以下 URL 列表:
urls = ['socket1.com', 'socket2.com']
我设置了一个 EventMachine 迭代器来打开与这些套接字的连接
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,同时不影响其他连接。
有什么想法吗?
我不确定 EM 迭代器是否是最好的工具,因为您希望在遍历数组时可能添加到数组中,这听起来不太安全。根据您的描述,听起来您更像是需要一个 pub/sub 样式的队列,它可以在添加新 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
过程,因为它都在 eventmachine 中,所以 WebSocket::EventMachine::Client 将在反应器循环的下一个滴答中处理 url,允许其余代码 运行,这反过来将排队更多 urls.
假设我有以下 URL 列表:
urls = ['socket1.com', 'socket2.com']
我设置了一个 EventMachine 迭代器来打开与这些套接字的连接
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,同时不影响其他连接。
有什么想法吗?
我不确定 EM 迭代器是否是最好的工具,因为您希望在遍历数组时可能添加到数组中,这听起来不太安全。根据您的描述,听起来您更像是需要一个 pub/sub 样式的队列,它可以在添加新 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
过程,因为它都在 eventmachine 中,所以 WebSocket::EventMachine::Client 将在反应器循环的下一个滴答中处理 url,允许其余代码 运行,这反过来将排队更多 urls.