在Crystal语言中,处理大量socket连接哪种方法更好呢?
为每个连接生成一个新的fiber,并将其传递给已接受的socket对象。这将允许内置的异步IO处理程序在有新数据可读时在socket之间切换上下文。
实现一个标准的
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)会更容易实现,并且更符合语言习惯。因此,您可以有很多纤维从套接字接收消息并将它们发送到通道,还可以有另一个纤维主动从通道接收消息以进行解析。
是否有一种简单的方法来尝试对其进行基准测试?