मेरा एपीआई उपयोगकर्ताओं को कुछ अद्वितीय आइटम खरीदने की अनुमति देता है, जहां प्रत्येक आइटम केवल एक उपयोगकर्ता को बेचा जा सकता है। इसलिए जब एकाधिक उपयोगकर्ता एक ही आइटम खरीदने का प्रयास करते हैं, तो एक उपयोगकर्ता को प्रतिक्रिया मिलनी चाहिए: ठीक और अन्य उपयोगकर्ता को प्रतिक्रिया too_late प्राप्त करना चाहिए।मल्टी-थ्रेडेड समवर्ती कैपिबरा अनुरोध?
अब, मेरे कोड में बग प्रतीत होता है। एक दौड़ की स्थिति। यदि दो उपयोगकर्ता एक ही आइटम को एक ही समय में खरीदने का प्रयास करते हैं, तो उन्हें दोनों को ठीक उत्तर मिलता है। मुद्दा उत्पादन में स्पष्ट रूप से पुन: उत्पन्न करने योग्य है।
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
यह की तरह लगता है एक ही समय में प्रश्नों निष्पादित नहीं करता है: अब मैं एक साधारण परीक्षण rspec के माध्यम से इसे पुन: पेश करने की कोशिश करता है कि लिखा है। इस परीक्षण के लिए, मैं अपने नियंत्रक कार्रवाई में निम्न कोड डाल:
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.
जो मुझे बताता है, कि कैपिबरा अनुरोध एक ही समय में नहीं चल रहे हैं, लेकिन एक समय में। मैं अपने कैपबरा अनुरोधों को समवर्ती कैसे कर सकता हूं?
ऊपर आपका कोड उदाहरण वर्तमान कैपिबरा डीएसएल की तरह दिखता नहीं है। यह रैक :: टेस्ट का उपयोग कर एक सादा नियंत्रक परीक्षण की तरह दिखता है। क्या यही वह चीज है? –