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これはスレッドセーフであり、OS が制御を奪うまでループするのではなく、キューに何もない場合にスレッドを一時停止するため、スレッドがビジー状態になるのを防ぎます。

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 に答える