Spawn vs Select 用于 Crystal 中的套接字处理

Spawn vs Select for socket handling in Crystal

在 Crystal 中处理多个套接字连接时,哪个更好?

  1. 为每个连接传递接受的套接字对象生成一个新的光纤。这将允许内置的异步 IO 处理程序在可以读取新数据时在套接字之间切换上下文。

  2. 实施标准 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) 更容易实现并且更符合语言的习惯。因此,您可以让许多纤程从套接字接收消息并将它们发送到通道,并让另一个纤程主动从通道接收消息以进行解析。

是否有一种简单的方法来尝试对其进行基准测试?

为每个新连接使用光纤,这将为您的 OS 提供最佳轮询,无论是 epoll、kpoll 还是我们内部使用的其他解决方案,都是比老化更好的解决方案 select.

奖金:它只是工作,你无事可做,我们确保有最好的表现!