chúng tôi sử dụng Rails và EventMachine cùng nhau, và khi sử dụng combo đó với Passenger, có một số thiết lập rất cụ thể cần được thực hiện. Sau rất nhiều thử nghiệm và lỗi, tôi đã khởi tạo EventMachine hoạt động tốt, nhưng tôi muốn hiểu mã tốt hơn một chút. Như bạn có thể thấy bên dưới trong đoạn mã này, trình khởi tạo của chúng tôi kiểm tra Hành khách và sau đó kiểm tra xem đó có phải là quá trình được chia nhỏ trước khi khởi động lại EventMachine hay không.EventMachine và Ruby Threads - những gì thực sự đang diễn ra ở đây?
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
Câu hỏi của tôi liên quan đến EM.reactor_running? và lệnh EM.stop. Nếu Hành khách đã chia rẽ quy trình của chúng tôi, tại sao tôi cần phải khởi động lại tham chiếu EM trong một chuỗi mới? Nếu EM.reactor_running? trả về true, cá thể EM nào tôi đang tham chiếu?
Bạn có thể xem mã khởi tạo đầy đủ trên blog của chúng tôi tại đây http://www.hiringthing.com/2011/11/04/eventmachine-with-rails.html
Cảm ơn mô tả tuyệt vời. Tôi rõ ràng về sự cần thiết để chạy EM trong thread riêng của nó, nhưng Khi bạn nói "EM loop có thể được còn lại", đó là nơi tôi là một chút không rõ ràng. Làm thế nào để một vòng lặp EM nhận được "còn sót lại"? Tôi không tắt quá trình cha mẹ 'EM, đúng không? – Joshua
Đó chính xác là những gì bạn đang làm. Bạn đang tắt một EM có khả năng còn sót lại từ quá trình cha mẹ. Nếu một vòng lặp EM chạy trong quá trình cha mẹ, nó sẽ được chia rẽ quá, nhưng bạn thường không phải ở tất cả các quan tâm đến các mô tả tập tin còn lại từ cha mẹ, vì vậy bạn bắt đầu từ đầu thay thế. Cho rằng Hành khách không thể chạy một vòng lặp EM bởi chính nó, đây là một biện pháp an toàn hơn bất cứ điều gì khác. – roidrage
Trong một mạch tương tự, tôi đang làm việc với RabbitMQ thông qua đá quý ruby-amqp, trong một ứng dụng websocket chạy dưới dạng mỏng. Thin có vòng lặp EventMachine riêng của nó, và tôi hiện đang sử dụng EventMachine.next_tick để đột nhập và làm công cụ amqp của tôi. Đây có phải là chính xác hoặc tôi nên sử dụng EventMachine.fork_reactor để cung cấp cho AMQP EM của riêng nó để sử dụng? – wchrisjohnson