2017-01-24 7 views
0

ich nur eine Einhorn Serverkonfiguration so gesehen habe, in meiner neuen Projekt Code-Basis:Unicorn Server Arbeiter 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 

Von dem, was ich über Einhorn wissen ist, dass es sich um einen Single-Threaded ist, Multi-Prozess Webserver.

Was macht dieser Thread.do Block? Was würde passieren, wenn all dieser andere Code dort wäre, ohne im Block Thread.do eingeschlossen zu sein?

+0

Abgesehen von Ihrer Frage, die von Vishnu prägnant beantwortet wurde, sind Sie sicher, dass dies genau der Code ist, den Sie gefunden haben? Weil es sofort nach dem Erstellen eines Kanals die Verbindung schließt ... – kaikuchn

Antwort

3

Ja Einhorn ist ein single-threaded, Multi-Prozess-Webserver. Hier wird Thread.do verwendet, um eine asynchrone Verbindung mit RabbitMQ über den Bunny-Client herzustellen. Das heißt, Unicorn wartet nicht auf die RabbitMQ-Verbindung, nachdem der Prozess erstellt wurde. Ein Thread würde auf dasselbe warten.

In Unicorn (oder MRI Ruby für die Angelegenheit) kann nur ein Thread die CPU auf einmal verwenden. Dies wird mit etwas erreicht, das als GIL oder Global Interpreter Lock bezeichnet wird.

dies lesen: http://www.jstorimer.com/blogs/workingwithcode/8085491-nobody-understands-the-gil

Und diese: https://en.wikipedia.org/wiki/Global_interpreter_lock

jedoch für IO-ops wie zum RabbitMQ Server auf eine Verbindung wartet, dieser Thread nicht die CPU-Zyklen und andere Threads können auf aufbrauchen laufen die CPU.

Wenn Thread.do nicht vorhanden ist und der RabbitMQ-Server nicht erreichbar ist, wartet der Prozess darauf, dass der Server verfügbar ist oder die Verbindung unterbrochen wird.

Verwandte Themen