簡體   English   中英

在Ruby on Rails中,線程,並發和分叉進程的當前狀態是什么?

[英]What are the current state of affairs on threading, concurrency and forked processes, in Ruby on Rails?

Ruby on Rails不能很好地執行多線程請求 - 響應,或者至少ActiveRecord沒有。

在創建Web應用程序時,只有一個請求響應同時處於活動狀態的概念可能會很麻煩,這些應用程序會分離需要很長時間才能完成的shell命令。

我想要的是你對這些設置的一些看法? Rails可能不適合某些應用程序嗎?

另外,Ruby on Rails中關於並發性的當前事態是什么? 什么是最佳實踐。 有缺點的解決方法嗎?

Rails目前不處理單個MRI(Matz Ruby Interpreter)Ruby進程中的並發請求。 每個請求都由一個巨大的互斥鎖包含。 很多工作已經開始使即將推出的Rails 2.2線程安全,但是當你在Ruby 1.8x下運行時,你不會從中獲得很多好處。 我不能評論Ruby 1.9是否會有所不同,因為我對它不是很熟悉,但可能不是我想的。

在這方面看起來非常有前景的一個領域是使用JRuby運行Rails,因為JVM通常被認為擅長多線程。 來自Sun Microsystems的Arun Gupta最近在RailsConf Europe上為這個設置提供了一些有趣的性能數據

Matz的Ruby 1.8使用綠色線程 ,而Matz的Ruby 1.9將使用本機O / S線程。 Ruby 1.8的其他實現,例如JRuby和IronRuby,使用本機O / S線程。 YARV是Yet Another Ruby VM的縮寫,也使用本機O / S線程,但具有全局解釋器鎖,以確保在任何給定時間只執行一個Ruby線程。

Neverblock允許非阻塞功能,而無需修改編寫程序的方式。 它確實是一個令人興奮的項目,並且已經向后移植到Ruby 1.8.x(它依賴於Ruby 1.9的光纖)。 它適用於PostgreSQL和MySQL,以執行非阻塞查詢。 基准很瘋狂......

如果您在shell上運行的內容對於頁面的呈現不是必需的(例如,您只是觸發維護任務或其他內容),則應將它們作為后台進程啟動。 檢查椋鳥和工作。

如果這不適用於您的情況,則必須確保運行應用服務器的多個實例。 傳統上人們會啟動Mongrel的多個實例。 但是現在我想說最簡單的方法就是使用Phusion Passenger 它是一個Apache模塊,可讓您輕松指定要運行的應用服務器的實例數(最小和最大)。 乘客完成其余的工作。 如果我沒記錯的話,它不會為調度請求做愚蠢的循環。 我認為這取決於可用性。

Ruby 1.9正在添加輕量級光纖:

http://www.infoq.com/news/2007/08/ruby-1-9-fibers

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM