2011-11-04 24 views
6

Rails ve EventMachine'ı birlikte kullanıyoruz ve bu combo'yu Yolcu ile birlikte kullanırken yapılması gereken çok özel bir kurulum var. Çok fazla deneme ve hatadan sonra, EventMachine başlatma işlemi iyi çalışıyor, ancak kodu biraz daha iyi anlamak istiyorum. Bu kod snippet'inde görebileceğiniz gibi, başlatıcımız Yolcuyu denetler ve sonra EventMachine'i yeniden başlatmadan önce çatallı bir işlem olup olmadığını kontrol eder.EventMachine and Ruby Threads - gerçekten burada neler oluyor?

if defined?(PhusionPassenger) 
    PhusionPassenger.on_event(:starting_worker_process) do |forked| 
    # for passenger, we need to avoid orphaned threads 
    if forked && EM.reactor_running? 
     EM.stop 
    end 
    Thread.new { 
     EM.run do 

Soruma EM.reactor_running ile ilgili mi? ve EM.stop komutları. Yolcu bizim sürecimizi zorladıysa, neden EM referansını yeni bir konuya yeniden başlatmam gerekiyor? EM.reactor_running ise? doğru döndürür, EM örneğini başvuruyor muyum?

Burada blogumuzda tüm http://www.hiringthing.com/2011/11/04/eventmachine-with-rails.html

cevap

13

İlk tam başlatıcı kodunu görebilirsiniz, sen bağımsız aynı EM örneğini başvuru hep edeceğiz ne öylesine olursa olsun, Yakut sürecinin başına yalnızca bir EventMachine örneği var Şu an içinde bulunduğunuz yeri girin.

Reaktörü yeni, ayrı bir iş parçacığından geçirin, böylece ana iş parçacığını engellemeyin (bunun amacı, web isteğini sunmaktır). EM.run aksi halde, kontrol döngüsüne girerek EM.run bloğundan ayrılmasın. EM.reactor_running? EM döngüsü bir yerde çalışıyorsa, doğru olarak döner. Yakut işlem başına sadece bir tane olduğundan, EM'nin çalışıp çalışmadığını anlamak için yöntem yeterince kolaydır.

Burada sahip olduğunuz kurulum, çalışan her şeyi etkilemeden normal bir Ruby işleminde EM kullanmanın en basit yoludur. Web uygulamanızdan bir AMQP brokerine mesaj gönderiyorsunuz. Bir mesaj gönderdiğinizde, EM'nin çalışma döngüsüne ayrı bir iş parçacığına girecektir, bu bölüm size oldukça şeffaftır ve Rails web isteğini ele almaya devam edebilen ana döngüyü etkilemez. EM.next_tick kullanarak her zaman bir şeyleri EM döngüsüne itmek için dikkatli olun. Farklı iş parçacıklarında EM tarafından açılan soketlerle uğraşmaya çalışmak, üretimde gördüğüm kötü olayların meydana gelmesine neden olabilirdi, bu arada, olayı denilen bir kütüphaneyi kullanarak ve oluşturarak tesadüfen;)

EM döngüsünü yeni bir tane çalıştırmadan önce durdurma Bir ana işlemden ayrılabilen bir EM döngüsünün, üst süreçte EM kullanarak, dosya tanıtıcıları ile ilgili sorunlara neden olabilir. Özel kodda bu, EM.fork_reactor kullanılarak engellenebilir, ancak ana işlem denetiminizin dışında olduğundan, yeni bir örneğe başlamadan önce bir reaktörün olup olmadığını kontrol etmek ve durdurmak için en güvenli yöntemdir.

+0

Harika bir açıklama teşekkürler. Kendi ipliğindeki EM'i çalıştırmaya ihtiyaç duyduğumdan eminim, ama "EM döngüsü bırakılabilir" dediğinizde, burası biraz belirsiz olduğum yer. Bir EM döngüsü "sola" nasıl alınır? Ebeveyn sürecini kapatmıyorum 'EM, doğru mu? – Joshua

+0

Tam olarak yaptığınız şey bu. Ebeveyn işleminden potansiyel olarak EM'den ayrılıyorsunuz. Bir EM döngüsünün ana işlemde çalıştırılması gerekirse, bu da çatal atılacaktır, ancak genellikle ebeveynden kalan dosya tanıtıcıları ile ilgilenmiyorsunuz, bu yüzden sıfırdan başlıyorsunuz. Yolcu'nun bir EM döngüsünü kendi başına yürütme olasılığı düşük olduğu göz önünde bulundurulduğunda, bu her şeyden çok bir güvenlik önlemidir. – roidrage

+0

Benzer şekilde, ben ince altında çalışan bir websocket uygulaması içinde, ruby-amqp gem yoluyla RabbitMQ ile çalışıyorum. Thin'in kendi EventMachine döngüsüne sahip olması ve şu anda EventMachine.next_tick'i kullanıp amqp ürünlerimi kullanıyorum. Bu doğru mu yoksa AMQP kullanmak için kendi EM kullanmak için EventMachine.fork_reactor kullanmalı mıyım? – wchrisjohnson

İlgili konular