gpt4 book ai didi

ruby - EventMachine WebSockets - 订阅 EM channel 与保持套接字在集合中

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

我正在构建一个使用 EM 和 WebSockets 并涉及向订阅的客户端广播数据的项目。

我想知道为什么人们更喜欢订阅一个 websocket 到一个 channel ,如下所示:

EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 8080) do |ws|

ws.onopen {
sid = @channel.subscribe { |msg| ws.send msg }
@channel.push "#{sid} connected!"

ws.onmessage { |msg|
@channel.push "<#{sid}>: #{msg}"
}

ws.onclose {
@channel.unsubscribe(sid)
}
}

end

将每个 websocket 添加到一个数组中:

EM::WebSocket.start(:host => "0.0.0.0", :port => 8080) do |ws|
ws.onopen {
puts "Websocket connection opened"
websocket_connections << ws
}
ws.onclose {
puts "Websocket connection closed"
websocket_connections.delete(ws)
}
end

并简单地遍历整个数组并在适当的时候(或相反的方式)进行类似的 ws.send msg 调用。

channel alternative 是否对EventMachine 的整个非阻塞特性有更好的优化? (例如,一次广播到一些订阅的套接字,然后继续其他套接字,而不是一次发送所有套接字)

最佳答案

EventMachine::Channel 类只是一个处理订阅者数组迭代的抽象。如果您查看 EventMachine::Channel#push 的 Ruby 源代码,您会发现它与您的建议类似:

def push(*items)
items = items.dup
EM.schedule { @subs.values.each { |s| items.each { |i| s.call i } } }
end

事实上,如果你不需要复制你的项目数组,它实际上比手动迭代列表要慢。但是,我怀疑性能影响是否显着。 EventMachine::Channel 只是一种抽象,可以更轻松地管理客户端列表。

关于ruby - EventMachine WebSockets - 订阅 EM channel 与保持套接字在集合中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12123974/

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