Ruby 访问同一变量的多个请求是否会导致冲突?
尝试一些我不太熟悉的东西:Ruby 访问同一变量的多个请求是否会导致冲突?,ruby,sinatra,worker,Ruby,Sinatra,Worker,尝试一些我不太熟悉的东西: 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和po
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,会发生什么情况
提高工作线程的优先级会有什么帮助吗?您应该为此使用,因为它用于跨线程通信。它是线程安全的,可以防止线程忙于等待,因为如果队列中没有任何内容,它将暂停线程,而不是循环,直到操作系统失去控制为止
require 'redis'
require 'sinatra'
require 'thread'
$redis = # Connect Redis
$log = Queue.new
Thread.new do
while entry = $log.pop
$redis.set 'test', entry
end
end
post '/' do
$log.push(request.user_agent)
"ok"
end
然而,由于MRI(其他没有GIL的Ruby实现可能会有问题),您所拥有的不会成为问题(就意外结果而言,性能将是一个问题)。此外,最好避免使用全局变量