2017-01-24 82 views
0

我剛看到一個麒麟服務器配置這樣的,在我的新項目的代碼庫:麒麟服務器工作配置

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 

從我所知道的獨角獸是,它是一個單線程,多進程網絡服務器。

這個Thread.do塊是做什麼的?如果所有其他代碼都沒有包含在Thread.do塊中,會發生什麼?

+0

除了你的問題,這是由毗溼奴簡潔地回答,你確定這正是你找到的代碼?因爲它在創建通道後立即關閉連接... – kaikuchn

回答

3

是獨角獸是一個單線程,多進程的Web服務器。在這裏,Thread.do被用來使用Bunny客戶端異步連接到RabbitMQ。也就是說,創建該進程後,獨角獸不會等待RabbitMQ連接。一個線程會等待相同的。

在獨角獸(或MRI ruby​​)中,一次只能有一個線程使用CPU。這是通過使用稱爲GIL或Global Interpreter Lock的東西來完成的。

閱讀:http://www.jstorimer.com/blogs/workingwithcode/8085491-nobody-understands-the-gil

而且這樣的:https://en.wikipedia.org/wiki/Global_interpreter_lock

但是,對於IO OPS像等待對的RabbitMQ服務器的連接,這個線程不會佔用的CPU週期和其他線程可以運行CPU。

如果Thread.do不存在,並且RabbitMQ服務器無法訪問,則該進程將等待服務器可用或連接超時。