Spawn vs Select 用于 Crystal 中的套接字处理
Spawn vs Select for socket handling in Crystal
在 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) 更容易实现并且更符合语言的习惯。因此,您可以让许多纤程从套接字接收消息并将它们发送到通道,并让另一个纤程主动从通道接收消息以进行解析。
是否有一种简单的方法来尝试对其进行基准测试?
为每个新连接使用光纤,这将为您的 OS 提供最佳轮询,无论是 epoll、kpoll 还是我们内部使用的其他解决方案,都是比老化更好的解决方案 select
.
奖金:它只是工作,你无事可做,我们确保有最好的表现!
在 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) 更容易实现并且更符合语言的习惯。因此,您可以让许多纤程从套接字接收消息并将它们发送到通道,并让另一个纤程主动从通道接收消息以进行解析。
是否有一种简单的方法来尝试对其进行基准测试?
为每个新连接使用光纤,这将为您的 OS 提供最佳轮询,无论是 epoll、kpoll 还是我们内部使用的其他解决方案,都是比老化更好的解决方案 select
.
奖金:它只是工作,你无事可做,我们确保有最好的表现!