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

假设我每秒获得几千次点击/。如果同时调用 push 和 pop 会发生什么$log

提高工作线程的优先级会有所帮助吗?

4

1 回答 1

2

您应该为此使用Queue,因为它用于跨线程通信。它是线程安全的,并且可以防止线程忙于等待,因为Queue#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(其他没有 GIL 的 Ruby 实现可能有问题),您所拥有的不会成为问题(就意外结果而言——性能将成为问题)。此外,最好避免使用全局变量。

于 2013-05-26T17:06:44.770 回答