在Crystal语言中,用于处理套接字的Spawn和Select有什么区别?

3

在Crystal语言中,处理大量socket连接哪种方法更好呢?

  1. 为每个连接生成一个新的fiber,并将其传递给已接受的socket对象。这将允许内置的异步IO处理程序在有新数据可读时在socket之间切换上下文。

  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)会更容易实现,并且更符合语言习惯。因此,您可以有很多纤维从套接字接收消息并将它们发送到通道,还可以有另一个纤维主动从通道接收消息以进行解析。

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

1个回答

1
为每个新连接使用一条光纤,这将利用您的操作系统的最佳轮询方式,无论是epoll、kpoll还是我们内部使用的其他轮询方式,都比老化的select更好的解决方案。
奖励:它只是有效工作,您什么都不需要做,我们确保具有最佳性能!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接