独角兽服务器工作者配置
Unicorn server worker config
我刚刚在我的新项目代码库中看到了这样的独角兽服务器配置:
worker_processes ENV['UNICORN_WORKERS'].to_i || 2
preload_app true
timeout 30
after_fork do |server, worker|
Thread.new do
begin
RABBIT_CONNECTION = Bunny.new(ENV['AMQP_URL'])
RABBIT_CONNECTION.start
rescue Bunny::TCPConnectionFailed => e
puts "Connection failed"
end
begin
OUTGOING_CHANNEL = RABBIT_CONNECTION.create_channel
rescue Bunny::PreconditionFailed => e
puts "Channel-level exception! Code: #{e.channel_close.reply_code},
message: #{e.channel_close.reply_text}".squish
ensure
RABBIT_CONNECTION.close
end
end
end
据我所知,unicorn 是一个单线程、多进程的 Web 服务器。
这个 Thread.do
块有什么作用?如果所有这些其他代码没有被包围在 Thread.do
块中,会发生什么情况?
是的 unicorn 是一个 single-threaded, multi-process 网络服务器。 这里,Thread.do 被用来异步连接到 RabbitMQ,使用兔子客户端。即unicorn创建进程后不等待RabbitMQ连接。线程会等待相同的。
在 Unicorn(或 MRI ruby 中)一次只有一个线程可以使用 CPU。这是使用称为 GIL 或全局解释器锁的东西来完成的。
读这个:http://www.jstorimer.com/blogs/workingwithcode/8085491-nobody-understands-the-gil
还有这个:https://en.wikipedia.org/wiki/Global_interpreter_lock
但是,对于等待与 RabbitMQ 服务器的连接等 IO 操作,此线程不会用完 CPU 个周期,而其他线程可以 运行 CPU。
如果 Thread.do 不存在,并且 RabbitMQ 服务器不可访问,进程将等待服务器可用或连接超时。
我刚刚在我的新项目代码库中看到了这样的独角兽服务器配置:
worker_processes ENV['UNICORN_WORKERS'].to_i || 2
preload_app true
timeout 30
after_fork do |server, worker|
Thread.new do
begin
RABBIT_CONNECTION = Bunny.new(ENV['AMQP_URL'])
RABBIT_CONNECTION.start
rescue Bunny::TCPConnectionFailed => e
puts "Connection failed"
end
begin
OUTGOING_CHANNEL = RABBIT_CONNECTION.create_channel
rescue Bunny::PreconditionFailed => e
puts "Channel-level exception! Code: #{e.channel_close.reply_code},
message: #{e.channel_close.reply_text}".squish
ensure
RABBIT_CONNECTION.close
end
end
end
据我所知,unicorn 是一个单线程、多进程的 Web 服务器。
这个 Thread.do
块有什么作用?如果所有这些其他代码没有被包围在 Thread.do
块中,会发生什么情况?
是的 unicorn 是一个 single-threaded, multi-process 网络服务器。 这里,Thread.do 被用来异步连接到 RabbitMQ,使用兔子客户端。即unicorn创建进程后不等待RabbitMQ连接。线程会等待相同的。
在 Unicorn(或 MRI ruby 中)一次只有一个线程可以使用 CPU。这是使用称为 GIL 或全局解释器锁的东西来完成的。
读这个:http://www.jstorimer.com/blogs/workingwithcode/8085491-nobody-understands-the-gil
还有这个:https://en.wikipedia.org/wiki/Global_interpreter_lock
但是,对于等待与 RabbitMQ 服务器的连接等 IO 操作,此线程不会用完 CPU 个周期,而其他线程可以 运行 CPU。
如果 Thread.do 不存在,并且 RabbitMQ 服务器不可访问,进程将等待服务器可用或连接超时。