Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 访问同一变量的多个请求是否会导致冲突?_Ruby_Sinatra_Worker - Fatal编程技术网

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实现可能会有问题),您所拥有的不会成为问题(就意外结果而言,性能将是一个问题)。此外,最好避免使用全局变量