我有下面的小西纳特拉计划。它只需打印当前时代的时间,然后在返回前睡上一秒:
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正如您所看到的,五个同时请求的结果都会产生相同的时间。
我做错了什么?
发布于 2013-09-10 21:03:43
Sinatra有一个单请求并发锁选项:
require 'rubygems'
require 'sinatra'
set :lock, true
get '/' do
time = Time.now.to_i
sleep 1
time.to_s
end发布于 2013-09-10 19:34:59
我想我想明白了。流调用启动一个立即返回的后台作业。因此互斥锁被快速解锁,允许处理一个新请求。
将代码移到流块之外的代码修复了它:
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
endhttps://stackoverflow.com/questions/18726932
复制相似问题