2013-05-26 37 views
0

嘗試出來的東西我不是很熟悉:訪問相同變量的多個請求是否會導致衝突?

require 'sinatra' 
require 'redis' 

$redis = # Connect Redis 
$log = [] 

Thread.new do 
    while true do 
    $redis.set 'test', $log.pop 
    end 
end 

post '/' do 
    $log.push(request.user_agent) 
    "ok" 
end 

說,我得到一對夫婦每秒幾千的點擊來/。如果在$log上同時調用push和pop,會發生什麼情況?

提高工作線程的優先級有助於什麼?

回答

2

您應該爲此使用Queue,因爲它是用於跨線程通信的。它是線程安全的,並且保持線程不處於繁忙等待狀態,因爲如果隊列中沒有任何內容,而是在操作系統取消控制權之前循環,則Queue#pop將掛起線程。

​​

但是,你有什麼不會的問題(據意想不到的結果去,性能將是一個問題),因爲MRI的GIL的(其他的Ruby實現沒有GIL可能有問題,雖然)。另外,最好避免使用全局變量。

相關問題