我的API允許用戶購買某些獨特的物品,其中每個物品只能出售給一個用戶。因此,當多個用戶試圖購買相同的物品時,一個用戶應該得到迴應: ok另一個用戶應該得到迴應 too_late。多線程併發水豚請求?
現在,我的代碼中似乎有bug。競賽條件。如果兩個用戶同時嘗試購買相同的物品,他們都會得到答案 ok。這個問題在生產中顯然是可重現的。現在我寫了一個簡單的測試,試圖通過rspec重現它:
context "when I try to provoke a race condition" do
# ...
before do
@concurrent_requests = 2.times.map do
Thread.new do
Thread.current[:answer] = post "/api/v1/item/buy.json", :id => item.id
end
end
@answers = @concurrent_requests.map do |th|
th.join
th[:answer].body
end
end
it "should only sell the item to one user" do
@answers.sort.should == ["ok", "too_late"].sort
end
end
它似乎不會同時執行查詢。爲了驗證這一點,我把下面的代碼放到我的控制器操作:
puts "Is it concurrent?"
sleep 0.2
puts "Oh Noez."
預計產出將是,如果請求是併發:
Is it concurrent?
Is it concurrent?
Oh Noez.
Oh Noez.
不過,我得到以下輸出:
Is it concurrent?
Oh Noez.
Is it concurrent?
Oh Noez.
這告訴我,水豚請求不是同時運行,而是一次運行一次。 如何使我的capabara請求併發?
上面的代碼示例看起來不像當前的Capybara DSL。它看起來更像是一個使用Rack :: Test的簡單控制器測試。那是什麼? –