কম্পিউটার

রুবিতে অ্যাসিঙ্ক্রোনাস থ্রেড পরীক্ষা করা হচ্ছে

থ্রেড এবং অ্যাসিঙ্ক্রোনাস পরিবেশ প্রাথমিকভাবে একটু কঠিন। মিথস্ক্রিয়া সংগঠিত করার জন্য একটি ভাল মানসিক মডেল ছাড়া, সমস্যায় পড়তে এবং অপ্রত্যাশিত ফলাফলের সাথে শেষ হওয়া সহজ। তার উপরে, সঠিক সরঞ্জাম বা পরীক্ষার প্যাটার্ন ছাড়া অ্যাসিঙ্ক্রোনাস কোড পরীক্ষা করা কঠিন হতে পারে।

থ্রেডগুলিকে মানুষ হিসাবে এবং শেয়ার করা বস্তুগুলিকে 'জিনিস' হিসাবে ভাবা যা মালিকানাধীন হতে পারে একটি মাল্টিথ্রেড সিস্টেমের কাজকে সংগঠিত করতে সহায়তা করে। এই পর্বে আমরা অ্যাসিঙ্ক্রোনাস রুবি কোড পরীক্ষা করার বিষয়ে সমস্ত কিছু জানতে একটি উদাহরণ দিয়ে যাব।

আপনি যদি রেল বা র্যাক বা সত্যিই কোনো অ্যাপ্লিকেশন ব্যবহার করেন যা একটি ওয়েব ব্রাউজার ফ্রন্ট এন্ড হিসাবে আপনি একটি অ্যাসিঙ্ক্রোনাস পরিবেশে রয়েছেন। র্যাক #call সবসময় অ্যাসিঙ্ক্রোনাস বলা হয়। তাই আপনি এটি জানেন বা না জানুন, আপনি ইতিমধ্যে মাল্টিথ্রেডেড উপাদান ব্যবহার করছেন এমন একটি ভাল সুযোগ রয়েছে৷

পরীক্ষা:ট্রিগার, সংগ্রহ এবং পরীক্ষা করুন

একটি অ্যাসিঙ্ক্রোনাস কলব্যাক API পরীক্ষা করা তিনটি ধাপের একটি প্যাটার্ন অনুসরণ করে সিঙ্ক্রোনাস করা যেতে পারে; ট্রিগার , সংগ্রহ করুন , এবং চেক করুন . চিন্তা করুন যদি প্রতিটি থ্রেড আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা বেশি 'থ্রেড দেয়, তা চিন্তা করে দেখুন

আমরা ব্যাটম্যান এবং তার 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
}

আপনি যদি এর গভীরে যেতে চান, আপনি একাধিক সময়সূচী তৈরি করার চেষ্টা করে উদাহরণটিকে আরও আকর্ষণীয় করে তুলতে পারেন এবং দেখতে পারেন কিভাবে Mutex $count রাখে। সংঘর্ষ থেকে পরিবর্তন। যেন ব্যাটম্যান কিছু স্যুট আলফ্রেডের কাছে ধোয়ার জন্য পাঠায়, আর কিছু ড্রাই ক্লিনারের কাছে। $target নিশ্চিত করতে যুক্তি পরিবর্তন করতে ভুলবেন না চেক হল সমস্ত প্রত্যাশিত ফলনের মোট।

রাউন্ডআপ

থ্রেড এবং অ্যাসিঙ্ক্রোনাস পরিবেশের সাথে কাজ করা সঠিক মানসিক মডেলের সাথে সহজ হয়ে যায়৷ এই পোস্টে আমরা থ্রেডের রূপক হিসাবে লোকেদের এবং ভাগ করা বস্তুর জন্য ভৌত বস্তু (স্যুট) রূপক হিসাবে ব্যবহার করেছি, যেগুলি শুধুমাত্র একটি থ্রেড বা ব্যক্তির মালিকানাধীন হতে পারে৷ . আমরা মনে করি এইভাবে বিমূর্তভাবে বোঝা এবং মনে রাখা সহজ করে তোলে।

আমরা আশা করি যে উদাহরণগুলি আপনাকে অ্যাসিঙ্কের প্রক্রিয়াগুলি মনে রাখবে, তবে আমরা আশা করি যে ব্যাটম্যানের সমস্ত স্যুটগুলি ধোয়ার সময় তার চিত্রটি শেষ হয়ে যাচ্ছে তা আপনার সাথে খুব বেশি দিন আটকে থাকবে না৷

পুনশ্চ. আপনি যদি ব্লগে সমস্ত ব্যাটম্যান রূপক দিয়ে থাকেন তবে আমাদের জানান।


  1. রুবিতে AWS Lambda ফাংশন তৈরি করা, পরীক্ষা করা এবং স্থাপন করা

  2. টেস্ট-কমিট-রিভার্ট:রুবিতে লিগ্যাসি কোড পরীক্ষা করার জন্য একটি দরকারী কর্মপ্রবাহ

  3. রুবি 2.6-এ 9টি নতুন বৈশিষ্ট্য

  4. রুবি থ্রেডগুলি কীভাবে ব্যবহার করবেন:টিউটোরিয়াল বোঝার জন্য সহজ