2010-07-07 13 views
5

मैं रूबी के साथ कुछ तरीकों atomicity निष्पादित करने के लिए चाहते हैं लिखें, http://en.wikipedia.org/wiki/Atomicity_(database_systems)एक परमाणु आपरेशन

उदाहरण के लिए के अनुसार, अगर मेरे पास है:

a = 30 
b = 75 

मैं की तरह कुछ करने के लिए सक्षम होने के लिए करना चाहते हैं:

atomic_operation do 
    a += 10 
    b -= 39 
end 

क्या रूबी 1.9 में कोई मूल मॉड्यूल है जो ऐसी प्रक्रिया को अनुमति देता है? यदि संभव हो, तो मैं प्लगइन का उपयोग किए बिना ऐसा करना चाहता हूं। बहुत धन्यवाद!

+0

https://github.com/headius/ruby-atomic पर और http://pragprog.com/book/jsthreads/working-with-ruby- अंदर एक नज़र डालें धागे –

उत्तर

7

यह वास्तव में उस नौकरी पर निर्भर करता है जिसमें आप नौकरी के लिए सही उपकरण के रूप में रुचि रखते हैं। यदि आप किसी डेटाबेस पर परमाणु संचालन करने की सोच रहे हैं, तो डेटाबेस ड्राइवर शायद (यदि यह कोई अच्छा/डेटाबेस इसका समर्थन करता है) तो डेटाबेस परमाणु अद्यतन करने के लिए डेटाबेस लेनदेन का उपयोग करने का एक तरीका प्रदान करता है।

यदि आप एक बहु-थ्रेडेड रूबी अनुप्रयोग के बारे में बात कर रहे हैं जो साझा संसाधनों परमाणु और थ्रेड-सुरक्षित के अपडेट करने का प्रयास कर रहा है, तो रूबी उस संबंध में आपकी सहायता के लिए म्यूटेक्स और कंडीशन वेरिएंबल कक्षाएं प्रदान करता है। (अधिक जानकारी: http://ruby-doc.org/docs/ProgrammingRuby/html/tut_threads.html)

+0

रुबी मानक पुस्तकालयों का हिस्सा हैं जो 'मॉनिटर' और 'मॉनिटरमिक्सिन' कक्षाएं भी देखें। एसपीएम के लिए –

4

जैसा कि आप डेटाबेस के बारे में एक लेख को इंगित करते हैं, मुझे लगता है कि आप इस संदर्भ में पूछ रहे हैं।

यदि आप रेल का उपयोग कर रहे हैं, तो आप transactionmethodsActiveRecord का उपयोग करें।

Account.transaction do 
    @alice.withdraw!(100) 
    @bob.deposit!(100) 
end 

यदि रेल के बाहर उपयोग करना है, तो आपको डेटाबेस ड्राइवर लाइब्रेरी प्रदान करने के साथ काम करना होगा। रेलवे पर implementation of transaction देखें कि यह कैसे किया जा सकता है इसका विचार प्राप्त करें।

2

आपको मेरे मित्र की क्या ज़रूरत है एक सॉफ्टवेयर लेनदेन स्मृति है। एसआरएम कार्यान्वयन का प्रयास करें जिसे मैं जेआरबी में खेल रहा हूं (आपको रेपो में कोड को चेकआउट करने की आवश्यकता है क्योंकि मैंने रिलीज के लिए इसे पैक नहीं किया है)।

रूबी परमाणु भी देखें, मैं http://github.com/saivenkat/ruby-atomic पर काम कर रहा हूं। एमआरआई पर आपको सीएएस प्रकार के संचालन देता है। यह थोड़ा कम स्तर है लेकिन आपको एक ही समस्या के साथ मदद करेगा। मैंने एमआरआई के लिए ट्रांजैक्शनल मेमोरी नहीं लिखी है लेकिन सीएएस इंफ्रास्ट्रक्चर के साथ यह लंबा नहीं होगा :)

पी एस स्टैक ओवरफ्लो मुझे एक से अधिक लिंक पोस्ट नहीं करने देता क्योंकि मैंने अपने सिस्टम का बहुत उपयोग नहीं किया था। तो JRuby

--Sai वेंकट में एसटीएम के लिए codehaus में मल्टीवर्स साइट चेकआउट

+0

+1 ओपी की जरूरत है। यद्यपि पुस्तकालय की कोशिश नहीं की है। –

6
(1,8 में और require('thread'))

Mutex वर्ग 1.9 क्रम में उपलब्ध है सूट और यदि आप कोई संदर्भ में परिचालन लॉक करने के लिए अनुमति देता है जाएगा।

# Typically defined in the object initializer 
@lock = Mutex.new 

# Then in your code 
@lock.synchronize do 
    a += 10 
    b -= 39 
end 

यह आपको गारंटी देगा कि Mutex # सिंक्रनाइज़ करने के लिए दिया गया ब्लॉक अनुक्रमिक रूप से चलाया जाता है।

आधिकारिक दस्तावेज़ यहाँ है: http://rubydoc.info/stdlib/core/1.9.2/Mutex

+0

नवीनतम दस्तावेज़ यहां है: https://ruby-doc.org/core-2.4.1/Thread/Mutex.html – ronen

संबंधित मुद्दे