Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Ruby

रूबी में एसिंक्रोनस थ्रेड्स का परीक्षण

थ्रेड और एसिंक्रोनस वातावरण शुरू में थोड़ा मुश्किल होते हैं। बातचीत को व्यवस्थित करने के लिए एक अच्छे मानसिक मॉडल के बिना, परेशानी में पड़ना और अप्रत्याशित परिणामों के साथ समाप्त होना आसान है। इसके अलावा, सही टूल या परीक्षण पैटर्न के बिना एसिंक्रोनस कोड का परीक्षण करना मुश्किल हो सकता है।

थ्रेड्स के बारे में लोगों के रूप में सोचने और साझा वस्तुओं को 'चीजों' के रूप में जो स्वामित्व में हो सकते हैं, एक मल्टीथ्रेडेड सिस्टम के काम को व्यवस्थित करने में मदद करता है। इस कड़ी में हम एसिंक्रोनस रूबी कोड के परीक्षण के बारे में सब कुछ जानने के लिए एक उदाहरण के माध्यम से जाएंगे।

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

परीक्षण:ट्रिगर करें, एकत्रित करें और जांचें

एसिंक्रोनस कॉलबैक एपीआई का परीक्षण तीन चरणों के पैटर्न का पालन करके सिंक्रोनस बनाया जा सकता है; ट्रिगर , इकट्ठा करें , और जांचें . सोचें कि क्या प्रत्येक धागा एक अलग व्यक्ति के रूप में और वस्तुओं के रूप में, साथ ही, ऐसी चीजें जो एक समय में केवल एक व्यक्ति के स्वामित्व में हो सकती हैं।

हम बैटमैन और उसके 7 अलग-अलग सूटों के उदाहरण का उपयोग करेंगे। क्योंकि यह एक व्यावहारिक उदाहरण है और हम यह जानने के महत्व को समझ सकते हैं कि क्या सभी सूट अल्फ्रेड के पास धोए जाने के लिए हैं जब आप रन आउट होने वाले हैं और शहर को बचाने वाले हैं।

उदाहरण:बैटकेव में कपड़े धोने का दिन

उदाहरण अल्फ्रेड बैटमैन के सूट धो रहा है। SuitWashScheduler एक अनुसूचक है जो प्रत्येक धुलाई घटना के लिए कॉलबैक का आह्वान करता है। शेड्यूलर शुरू होने के एक सेकंड बाद शुरू होने वाले एक-सेकंड के अंतराल पर सात कॉलबैक करता है। ट्रिगर SuitWashScheduler . का निर्माण है ।

class SuitWashScheduler
  def initialize(cnt)
    Thread.new {
      cnt.times {
        sleep(1.0)
        yield
      }
    }
  end
end

संग्रह करना

दौड़ की स्थिति से बचने के लिए परिणाम एकत्रित करना थ्रेड सुरक्षित होना चाहिए। एक से अधिक थ्रेड में साझा की गई किसी भी वस्तु को संरक्षित किया जाना है। संरक्षण किसी वस्तु के स्वामी पर नज़र रखने का एक तरीका है। केवल स्वामी ही परिवर्तन कर सकता है या वस्तु को देख सकता है। एक सूट केवल बैटमैन के साथ लड़ाई में इस्तेमाल करने के लिए, या अल्फ्रेड के साथ धोने के लिए हो सकता है।

मित्रवत रहने के लिए एक धागा (बैटमैन या अल्फ्रेड के रूपक में) केवल थोड़े समय के लिए स्वामित्व लेता है और फिर स्वामित्व छोड़ देता है। एक Mutex आमतौर पर मालिक का ट्रैक रखने के लिए प्रयोग किया जाता है। SuitwashScheduler काउंटर बढ़ने पर कॉलबैक परिणाम काउंटर का मालिक होगा। कॉलबैक जो SuitWashScheduler . में चलाया जाता है थ्रेड संकेत देता है कि जब काउंटर लक्ष्य से टकराता है तो सभी परिणाम प्राप्त हो जाते हैं।

उदाहरण लिखना कुछ ग्लोबल्स की स्थापना के साथ शुरू होता है। एक वास्तविक अनुप्रयोग में ग्लोबल्स को वर्ग या वस्तु विशेषताओं से बदल दिया जाएगा।

$main_thread = Thread.current
$mu = Mutex.new
$count = 0
$target = 7

प्रबंधन और मालिक

$main_thread और $mu $target . के दौरान थ्रेड्स को प्रबंधित करने और परीक्षण के पूरा होने की प्रतीक्षा करने के लिए उपयोग किया जाता है और $count परीक्षण के परिणामों को ट्रैक करें। याद रखें कि यह एक मामूली परीक्षा है, इसलिए परिणाम एकत्र करना और जांचना आसान होना चाहिए।

SuitWashScheduler . का एक नया उदाहरण बनाकर परीक्षण शुरू किया गया है , प्रारंभकर्ता को $target . दे रहा है पुनरावृत्तियों की संख्या। इस मामले में, 7 सूट जिन्हें धोने की आवश्यकता होती है। प्रदान किया गया ब्लॉक SuitWashScheduler में चलाया जाएगा। धागा। प्रत्येक पुनरावृत्ति के लिए $count वृद्धि और मुद्रित है।

आगे देखते हुए हम महसूस करते हैं कि मुख्य, परीक्षण सूत्र $count . की जाँच करने जा रहा है जिसका अर्थ यह भी है कि उसे $count . के स्वामित्व की आवश्यकता होगी साथ ही $count . का स्वामित्व लेने का एक साधन भी है ज़रूरी है। $mu Mutex उदाहरण स्वामित्व टोकन है। SuitWashScheduler.new . को दिए गए ब्लॉक में एक $mu.synchronize . पर कॉल करें $count . को सेट करने के लिए ब्लॉक स्वामित्व में काफ़ी समय लेता है और परिणामों की जांच करें। एक पल में परिणामों की अधिक जाँच करें।

SuitWashScheduler.new($target) {
  $mu.synchronize {
    $count += 1
    puts $count
    $main_thread.wakeup if $target <= $count
  }
}

जांचें:क्या सभी सूट तैयार हैं?

मुख्य धागे पर वापस हमें परीक्षण समाप्त होने की प्रतीक्षा करने की आवश्यकता है। बैटमैन को सभी 7 सूट किए जाने से पहले इंतजार करना होगा। जाँच करने के लिए दो शर्तें हैं; परीक्षण $count को अपडेट करते हैं जैसा कि अपेक्षित था या बैटमैन परीक्षण समाप्त होने और समय समाप्त होने के इंतजार में ऊब जाता है। $count की जांच करने से पहले यह देखने के लिए कि क्या यह $target . तक पहुंच गया है , $count . का स्वामित्व ज़रूरी है। ठीक वैसे ही जैसे SuitWashScheduler . के लिए ब्लॉक में है $mu.synchronize . के लिए एक कॉल उपयोग किया जाता है।

लेकिन यह सही नहीं हो सकता, अगर हम मुख्य धागे को बंद कर दें तो SuitWashScheduler कैसे हो सकता है थ्रेड कभी भी $count को बदलें ? सौभाग्य से हमारे लिए एक साफ-सुथरी चाल है जो इसका ख्याल रखती है। Mutex कक्षा में एक #sleep है वह विधि जो स्वामित्व छोड़ देती है और तब तक प्रतीक्षा करती है जब तक कि वह समय समाप्त न हो जाए या जाग न जाए। एक बार या तो टाइमआउट या #wakeup . के माध्यम से जाग जाने पर मुख्य सूत्र पर कॉल करें $mu जारी रखने से पहले फिर से स्वामित्व लेने का प्रयास करता है। एक बार स्वामित्व प्राप्त हो जाने के बाद परिणामों की जाँच की जा सकती है और परीक्षा में उत्तीर्ण या असफल स्थिति का निर्धारण किया जा सकता है।

$mu.synchronize {
  $mu.sleep($target + 1)
  if $target != $count
    puts 'FAILED'
  else
    puts 'Passed! All suits are washed and clean'
  end
}

यदि आप इसमें गहराई से जाना चाहते हैं, तो आप एकाधिक शेड्यूलर बनाने की कोशिश करके उदाहरण को थोड़ा और दिलचस्प बना सकते हैं और देख सकते हैं कि म्यूटेक्स कैसे $count रखता है टकराने से परिवर्तन। जैसे कि बैटमैन अल्फ्रेड को धोने के लिए कुछ सूट भेजता है, और कुछ अन्य ड्राई क्लीनर को। यह सुनिश्चित करने के लिए तर्क बदलना सुनिश्चित करें कि $target चेक सभी अपेक्षित प्रतिफल का कुल योग है।

राउंडअप

सही मानसिक मॉडल के साथ धागे और अतुल्यकालिक वातावरण के साथ काम करना आसान हो जाता है। इस पोस्ट में हमने लोगों को धागे और भौतिक वस्तुओं (सूट) के रूपक के रूप में साझा वस्तुओं के रूपक के रूप में इस्तेमाल किया, जो कि एक समय में केवल एक धागे या व्यक्ति के स्वामित्व में हो सकता है . हमें लगता है कि इस तरह से अमूर्त करने से समझने और याद रखने में आसानी होती है।

हम आशा करते हैं कि इन उदाहरणों से आपको एसिंक्स की क्रियाविधि याद आ जाएगी, लेकिन हम आशा करते हैं कि जब बैटमैन के सारे सूट धोए जा रहे हों, तो उसकी छवि बहुत देर तक आपके साथ नहीं रहेगी।

पी.एस. यदि आप ब्लॉग पर सभी बैटमैन रूपकों के साथ काम कर चुके हैं, तो हमें बताएं।


  1. टेस्ट-कमिट-रिवर्ट:रूबी में लिगेसी कोड के परीक्षण के लिए एक उपयोगी कार्यप्रवाह

    ऐसा हम में से अधिकांश के साथ होता है। जैसे-जैसे सॉफ्टवेयर प्रोजेक्ट बढ़ते हैं, कोडबेस के कुछ हिस्से बिना व्यापक परीक्षण सूट के उत्पादन में समाप्त हो जाते हैं। जब आप कुछ महीनों के बाद कोड के उसी क्षेत्र पर फिर से नज़र डालते हैं, तो इसे समझना मुश्किल हो सकता है; इससे भी बदतर, एक बग हो सकता है, और हम न

  1. रूबी में 9 नई सुविधाएँ 2.6

    रूबी का एक नया संस्करण नई सुविधाओं और प्रदर्शन में सुधार के साथ आ रहा है। क्या आप परिवर्तनों के साथ बने रहना चाहेंगे? आइए एक नज़र डालते हैं! अंतहीन रेंज रूबी 2.5 और पुराने संस्करण पहले से ही अंतहीन श्रेणी के एक रूप का समर्थन करते हैं (Float::INFINITY के साथ) ), लेकिन रूबी 2.6 इसे अगले स्तर पर ले

  1. रूबी थ्रेड्स का उपयोग कैसे करें:ट्यूटोरियल को समझने में आसान

    रूबी में धागा क्या है? थ्रेड आपके रूबी प्रोग्राम को एक ही समय में कई काम करते हैं। जैसी चीजें : एकाधिक फ़ाइलें पढ़ना एकाधिक वेब अनुरोध को संभालना एकाधिक API कनेक्शन बनाना थ्रेड्स का उपयोग करने के परिणामस्वरूप, आपके पास एक बहु-थ्रेडेड रूबी प्रोग्राम होगा, जो चीजों को तेजी से पूरा करने में सक्षम