2012-12-25 21 views
20

test için hazırlayın: Bir eylem sleep 10Çoklu talepleri aynı anda raylar nasıl çözer?

Testi: tarayıcıda Aç iki sekme eylemi ziyarete

Sonuç: ikinci isteği çalışırken, İlk istek tamamlandı ve görünümü oluşturmaya başladı, ancak görünüm hala boş. İkinci istek de bittiğinde, iki istek aynı anda görünümü oluşturmayı bitirdi.

Sonuç: Raylar sadece tek bir örnektir. Bir istek yalnızca önceki istekler tamamlandıktan sonra eylemi girebilir. Fakat cevap bölümünü nasıl açıklayabiliriz? Çoklu talepler neden aynı anda görüntülemeleri bitirir?

cevap

4

WEBrick sunucusu kullanıyor musunuz? Bunun nedeni, sunucunuzun tek bir iş parçacığı sunucusudur ve bir kerede bir isteği karşılayabilmesidir (tek çalışan iş parçacığı nedeniyle). Şimdi birden çok istek durumunda, isteğin işlem bölümünü çalıştırır ve görünüm oluşturucuyu çalıştırmadan önce, bekleyen isteklerin olup olmadığını kontrol eder. Şimdi 10 istek dizilmişse, ilk önce görünümleri oluşturmadan önce hepsini tamamlar. Bu taleplerin tümü tamamlandığında, görünümler sırayla oluşturulacaktı.

Çok iş parçacıklı bir ortam istiyorsanız, Yolcu veya Unicorn sunucusuna geçebilirsiniz.

Bunun mantıklı olmasını umuyorum.

+0

sayesinde, beni daha az karıştı olun. Aynı anda daha fazla istekle test ediyorum, 10'dan az istek dizildikten sonra, webrick görüntülemeleri oluşturacak ve ardından diğer istekleri çözecek gibi görünüyor. –

+0

Bence webrick tek bir dişli sunucu değil, 'config.threadsafe!' production.rb'de, çoklu talepleri aynı anda çözecektir. –

+0

'config.threadsafe!', WEBrick'i otomatik olarak çok iş parçacıklı hale getirmez.Detaylar için cevabımı görün. – Nowaker

19

WEBrick çok iş parçacıklıdır, ancak Rails geliştiricileri bir muteks kodlamasına sahiptir, bu nedenle aynı anda yalnızca bir isteği işleyebilir. Rails::Server maymun yama yapabilir ve çok iş parçacıklı bir WEBrick'i çalıştırmakta özgürsünüz.

Sadece WEBrick'in RAILS_ENV=production'a özgü olan config.cache_classes = true ve config.eager_load = true yapılandırmalarında çok iş parçacıklı olacağını unutmayın. Bunun nedeni, geliştirme aşamasında sınıfın iş parçacığı için güvenli olmamasıdır.

WEBrick tam çok kanallı Raylar 4.0, sadece config/initializers/multithreaded_webrick.rb eklemek bu almak için:

# Remove Rack::Lock so WEBrick can be fully multi-threaded. 
require 'rails/commands/server' 

class Rails::Server 
    def middleware 
    middlewares = [] 
    middlewares << [Rails::Rack::Debugger] if options[:debugger] 
    middlewares << [::Rack::ContentLength] 

    Hash.new middlewares 
    end 
end 

biz kurtulduk rails/commands/server.rb kusurlu kodudur:

# FIXME: add Rack::Lock in the case people are using webrick. 
# This is to remain backwards compatible for those who are 
# running webrick in production. We should consider removing this 
# in development. 
if server.name == 'Rack::Handler::WEBrick' 
    middlewares << [::Rack::Lock] 
end 

Bu ihtiyaç değil Raylarda 4.2. Eşzamanlı kutudan çıktı. senin env kurulum yapılandırma/ortamlar/development.rb (veya config/application.rb olarak)

bu satırı ekleyin altında

+0

Eklendi, ancak yine de "Rack :: Lock" ara parçasına – geekazoid

+1

@geekazoid, Rails 4.1 ekliyor? Sadece Rails 4.0'da test ettim. Bunu 4.1'de nasıl yapacağımı göreceğim. – Nowaker

+0

'config.allow_concurrency = true' eklenerek çözüldü mü? – geekazoid

0

:

#Enable threaded mode 
    config.threadsafe! 
+1

Bu seçenek artık gerekli/desteklenmiyor (en azından Raylar 4'ten beri). Ayrıntılar için bkz. Http://tenderlovemaking.com/2012/06/18/removing-config-threadsafe.html – ToniTornado