2011-03-09 57 views
0

比方說,我有以下的線程在我的Rails Web應用程序:一種通過Rails在多個httpd線程之間共享變量的方法?

class MyController 
    def my_action 
    count = 0 
    arr = [] 

    10.times do |i| 
     arr[i] = Thread.new { 
     sleep(rand(0)/10.0) 
     Thread.current["mycount"] = count 
     count += 1 
     } 
    end 

    arr.each {|t| t.join; print t["mycount"], ", " } 
    puts "count = #{count}" 
    end 
end 

正如你所看到的,「計數」變量在所有線程共享。現在

我想要做的是份額「計數」跨多個httpd的請求,並允許在my_action到myController的可以訪問該變量。舉例來說,也許無論什麼產生ruby進程爲httpd進程提供服務可以在其範圍內保存變量計數,然後爲httpd進程生成的ruby進程可以訪問該變量。

使用memcached,數據庫和會話變量是不可能的。最終'計數'實際上是一個資源對象...一個FTP連接。

這可能嗎?也許使用Apache /乘客工作者,如this

示例代碼將不勝感激。

+1

Rails是單線程設計,所以我不相信你想要做什麼是可能的或可取的。至少,我從來沒有見過它做過。 – 2011-03-09 18:41:08

+0

好吧,這很糟糕。必須有一些方法來解決這樣的問題。 – 2011-03-09 19:29:29

回答

1

這確實可以使用全局變量。 Rails中的全局變量是以美元符號開始的變量,如$ count。

+0

不會全局涉及競爭條件,除非訪問是同步的? – Crashalot 2013-03-14 08:32:18

+0

根據你的用途,我想是這樣。我只是使用其中一個來保持FTP連接在HTTP請求中處於活動狀態,並且它運行得非常好。 – 2013-03-14 17:54:19