0

我有以下 Sinatra 小程序。它只是打印当前纪元时间,然后在返回之前休眠一秒钟:

require 'rubygems'
require 'sinatra'

get '/' do
    Thread.new do 
        $mutex.synchronize do
            stream do |out|
                out << "\n" << Time.now.to_i 
                sleep 1
            end
        end
    end.join
end

$mutex = Mutex.new

我希望互斥锁强制按顺序处理 Web 请求。但是,根据此测试,情况似乎并非如此:

$ for i in $(seq 5) ; do curl localhost:4567/ & disown; done
1378839480
1378839480
1378839480
1378839480
1378839480

如您所见,五个同时请求的结果都产生相同的纪元时间。

我究竟做错了什么?

4

2 回答 2

3

Sinatra 有一个单一的请求并发锁选项:

require 'rubygems'
require 'sinatra'

set :lock, true

get '/' do
  time = Time.now.to_i
  sleep 1
  time.to_s
end
于 2013-09-10T21:03:43.787 回答
1

我想我想通了。流调用启动一个后台作业,该作业立即返回。所以互斥锁很快被解锁,允许处理一个新的请求。

将代码移到流块之外可以修复它:

get '/' do
    Thread.new do 
        $mutex.synchronize do
            result = "\n" + Time.now.to_i
            sleep 1
            stream do |out|
                out << result
            end
        end
    end.join
end
于 2013-09-10T19:34:59.660 回答