sockets - Crystal 中套接字处理的 Spawn 与 Select

标签 sockets crystal-lang

哪种方式可以更好地处理 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) 会更容易实现并且对语言来说更惯用。因此,您可以让许多纤程从套接字接收消息并将它们发送到 channel ,并让另一个纤程主动从 channel 接收消息进行解析。

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

最佳答案

为每个新连接使用光纤,这将利用最适合您的操作系统的轮询,无论是 epoll、kpoll 还是我们内部使用的其他轮询,并且是比老化的 select 更好的解决方案。

奖励:它只是有效,您无需做任何事情,我们确保获得最佳性能!

关于sockets - Crystal 中套接字处理的 Spawn 与 Select,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41419175/

相关文章:

function - 如何访问函数内部的全局变量

c++ - Asio tcp 套接字上的未初始化读取错误

javascript - WebSockets + PHP套接字不起作用

java - Android 中的网络设备列表

class - 何时在 Crystal 中使用扩展 self 的类与模块?

metaprogramming - 如何检查是否在 Crystal 中定义了常量

concurrency - 我怎样才能停止光纤?

node.js - 如何为我的网站实现实时推送通知?

sockets - 收到[FIN, ACK]后继续使用同一个连接

crystal-lang - 运行 shell 命令 Crystal 语言并捕获输出