哪种方式可以更好地处理 Crystal 中的许多套接字连接?
为每个连接生成一个新的纤程,并将其接受的套接字对象传递给它。这将允许内置异步 IO 处理程序在有新数据可供读取时在套接字之间切换上下文。
实现标准
select()
循环,该循环使用select()
轮询套接字以获取要读取的数据,以便可以处理数据。
选项 1 的示例可以是:
loop do
accepted_socket = socket.accept
spawn receive_data(accepted_socket)
end
def receive_data(socket)
loop do
#do something useful when data arrives on any socket
puts socket.gets
end
end
我不确定哪种设计会更好,但我认为选项 1) 会更容易实现并且对语言来说更惯用。因此,您可以让许多纤程从套接字接收消息并将它们发送到 channel ,并让另一个纤程主动从 channel 接收消息进行解析。
是否有一种简单的方法来尝试对此进行基准测试?
最佳答案
为每个新连接使用光纤,这将利用最适合您的操作系统的轮询,无论是 epoll、kpoll 还是我们内部使用的其他轮询,并且是比老化的 select
更好的解决方案。
奖励:它只是有效,您无需做任何事情,我们确保获得最佳性能!
关于sockets - Crystal 中套接字处理的 Spawn 与 Select,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41419175/