多处理器/多线程Ruby Web服务器如何工作?

时间:2014-05-29 20:10:20

标签: ruby multithreading sockets process webserver

以下代码是对具有3个工作程序(进程)的Web服务器的模拟,并且对于每个新连接,所选工作程序创建新线程。我无法理解的是如何选择一名工人来响应一个连接?以及三个工人如何在没有问题的情况下听取类似的端口。

require 'socket'
require 'thread'

server = TCPServer.new('0.0.0.0', 8080)
3.times do
 break unless fork
end

loop do
 connection = server.accept
 Thread.new do
        request = connection.gets

        connection.puts request
        connection.puts Process.pid.to_s # this will change with each request.
        connection.puts "status"
        connection.puts "Headers"
        connection.puts "Body"
        connection.close
 end
end

1 个答案:

答案 0 :(得分:2)

TCP服务器侦听端口,等待新的连接请求。当有人来时,它会为特定客户端(在另一个端口上)创建一个专用套接字,将其交给工作人员,然后继续监听主端口。

connection = server.accept

上面一行是工作人员告诉服务器“我已准备好接收新套接字”的行,服务器将返回它为最新客户端请求创建的套接字。

如果有多个工作人员在等待一个新套接字(所有调用server.accept),服务器会选择其中一个(它不应该重要哪一个,但显而易见实施是“先到先得”),其余的只是等待下一个请求......