gpt4 book ai didi

ruby - 如何使用 Ruby 连接到多个 WebSockets?

转载 作者:数据小太阳 更新时间:2023-10-29 08:58:31 26 4
gpt4 key购买 nike

使用 faye-websocket和 EventMachine 的代码看起来非常类似于 faye-websocket 的客户端示例:

require 'faye/websocket'
require 'eventmachine'

def setup_socket(url)
EM.run {
ws = Faye::WebSocket::Client.new(url)

ws.on :open do ... end

ws.on :message do ... end

ws.on :close do ... end
}
end

我想同时打开多个连接。我不能简单地多次调用 setup_socket,因为执行不会退出 EM.run 子句。我尝试在单独的线程中多次运行 setup_socket :

urls.each do |url|
Thread.new { setup_socket(url) }
end

但它似乎没有做任何事情,因为 puts 语句没有到达输出。

我并不局限于使用 faye-websocket,但似乎大多数人都使用这个库。如果可能的话,我想避免多线程。我也不希望失去随时间进行更改(例如添加新的 websocket)的可能性。因此,在 EM.run 子句中移动 URL 的迭代是不可取的,而是启动多个 EM 会更有益。我找到了一个 example for starting multiple servers via EM以一种非常干净的方式。我正在寻找类似的东西。

如何同时连接到多个 WebSocket?

最佳答案

这是一种方法。

首先,您必须接受 EM 线程需要运行。没有这个线程,您将无法处理任何当前连接。所以你无法解决这个问题。

然后,为了向 EM 线程添加新的 URL,您需要某种方式从主线程到 EM 线程进行通信,这样您就可以告诉它启动一个新的连接。这可以通过 EventMachine::Channel 来完成。

所以我们现在可以构建的是这样的:

@channel = EventMachine::Channel.new

Thread.new {
EventMachine.run {
@channel.subscribe { |url|
ws = Faye::...new(url)
...
}
}
}

然后在主线程中,任何时候你想向事件循环添加一个新的 URL,你只需使用这个:

def setup_socket(url)
@channel.push(url)
end

关于ruby - 如何使用 Ruby 连接到多个 WebSockets?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42508643/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com