ক্রোমিয়াম ক্রনিকল #1: টাস্ক শিডিউলিং সেরা অনুশীলন

Chrome টিম Chromium Chronicle চালু করতে পেরে গর্বিত, একটি মাসিক সিরিজ যা বিশেষভাবে Chromium ডেভেলপার, ডেভেলপার যারা ব্রাউজার তৈরি করে তাদের জন্য।

Chromium Chronicle প্রাথমিকভাবে ক্রোম লেখা, নির্মাণ এবং পরীক্ষা করার জন্য প্রযুক্তিগত জ্ঞান এবং সর্বোত্তম অনুশীলন ছড়িয়ে দেওয়ার উপর ফোকাস করবে। আমাদের পরিকল্পনা হল যে বিষয়গুলি প্রাসঙ্গিক এবং Chromium বিকাশকারীদের জন্য উপযোগী, যেমন কোড স্বাস্থ্য, সহায়ক সরঞ্জাম, ইউনিট পরীক্ষা, অ্যাক্সেসযোগ্যতা এবং আরও অনেক কিছু! প্রতিটি নিবন্ধ ক্রোম ইঞ্জিনিয়ারদের দ্বারা লিখিত এবং সম্পাদনা করা হবে।

আমরা এই নতুন সিরিজ সম্পর্কে উত্তেজিত, এবং আপনিও আশা করি! ডুব দিতে প্রস্তুত? নীচের আমাদের প্রথম পর্বটি একবার দেখুন!

টাস্ক শিডিউলিংয়ের সেরা অভ্যাস

পর্ব 1: মন্ট্রিলে গ্যাব্রিয়েল চ্যারেট দ্বারা, পিকিউ (এপ্রিল, 2019)
আগের পর্বগুলো

ক্রোম কোড যার জন্য ইন-প্রসেস অ্যাসিঙ্ক্রোনাস এক্সিকিউশনের প্রয়োজন হয় সাধারণত কাজগুলিকে সিকোয়েন্সে পোস্ট করে। সিকোয়েন্সগুলি ক্রোম-পরিচালিত "ভার্চুয়াল থ্রেড" এবং আপনার নিজের থ্রেড তৈরি করতে পছন্দ করে৷ কিভাবে একটি বস্তু জানতে পারে কোন ক্রম পোস্ট করতে হবে?

করবেন না

পুরানো দৃষ্টান্ত হল স্রষ্টার কাছ থেকে একটি সিকোয়েন্সড টাস্করানার পাওয়া:

Foo::Foo(scoped_refptr backend_task_runner)
    : backend_task_runner_(std::move(backend_task_runner)) {}
করবেন

পছন্দের দৃষ্টান্ত হল একটি স্বাধীন সিকোয়েন্সড টাস্করানার তৈরি করা:

Foo::Foo()
    : backend_task_runner_(
          base::CreateSequencedTaskRunnerWithTraits({
              base::MayBlock(), base::TaskPriority::BEST_EFFORT})) {}

এটি পড়া এবং লিখতে সহজ কারণ সমস্ত তথ্য স্থানীয় এবং সম্পর্কহীন কাজের সাথে আন্তঃনির্ভরতার কোন ঝুঁকি নেই।

পরীক্ষার ক্ষেত্রে এই দৃষ্টান্তটি আরও ভাল। টাস্ক রানারদের ম্যানুয়ালি ইনজেকশন দেওয়ার পরিবর্তে, পরীক্ষাগুলি Foo-এর কাজগুলি পরিচালনা করার জন্য একটি নিয়ন্ত্রিত টাস্ক পরিবেশ তৈরি করতে পারে:

class FooTest : public testing::Test {
 public
  (...)
 protected:
  base::test::TaskEnvironment task_environment_;
  Foo foo_;
};

ফিক্সচারে প্রথমে TaskEnvironment থাকা স্বাভাবিকভাবেই নিশ্চিত করে যে এটি Foo-এর জীবনকাল জুড়ে টাস্ক এনভায়রনমেন্ট পরিচালনা করে। TaskEnvironment একটি SequencedTaskRunner তৈরি করার জন্য Foo-এর অনুরোধ-অন-কনস্ট্রাকশন ক্যাপচার করবে এবং প্রতিটি FooTest-এর অধীনে তার কাজগুলি পরিচালনা করবে।

অ্যাসিঙ্ক্রোনাস এক্সিকিউশনের ফলাফল পরীক্ষা করতে, RunLoop::Run()+QuitClosure() প্যারাডাইম ব্যবহার করুন :

TEST_F(FooTest, TestAsyncWork) {
  RunLoop run_loop;
  foo_.BeginAsyncWork(run_loop.QuitClosure());
  run_loop.Run();
  EXPECT_TRUE(foo_.work_done());
}

এটি RunUntilIdle() এর জন্য পছন্দ করা হয়, যা অসিঙ্ক্রোনাস ওয়ার্কলোড যদি টাস্কএনভায়রনমেন্টের পরিধির বাইরে কোনো কাজ জড়িত থাকে, যেমন একটি সিস্টেম ইভেন্ট, তাই যত্ন সহকারে RunUntilIdle() ব্যবহার করুন।

আরো জানতে চান? থ্রেডিং এবং কাজ সম্পর্কে আমাদের ডকুমেন্টেশন পড়ুন বা টাস্কএনভায়রনমেন্টে মাইগ্রেশনে জড়িত হন!