将另一个 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.