The Chromium Chronicle #1: टास्क को शेड्यूल करने के सबसे सही तरीके

Chrome टीम को, हर महीने के हिसाब से Chromium Chronicle लॉन्च करते हुए गर्व महसूस हो रहा है यह सीरीज़ ख़ास तौर पर Chromium डेवलपर के लिए बनाई गई है. ये ऐसे डेवलपर होते हैं जो ब्राउज़र खोलें.

Chromium Chronicle मुख्य रूप से तकनीकी जानकारी बढ़ाने पर फ़ोकस करेगा साथ ही, Chrome लिखने, बनाने, और उसकी जाँच करने के सबसे सही तरीक़े बताए गए हैं. हमारी योजना है कि खास तौर पर, ऐसे विषय जो Chromium डेवलपर के लिए काम के और उपयोगी होते हैं, जैसे कि कोड स्वास्थ्य, मददगार टूल, यूनिट टेस्टिंग, सुलभता वगैरह! हर लेख इसे Chrome के इंजीनियर ही लिखेंगे और उसमें बदलाव करेंगे.

हमें अपनी नई सीरीज़ का बेसब्री से इंतज़ार है. उम्मीद है कि आप भी ऐसे ही हैं! क्या आप इस्तेमाल करने के लिए तैयार हैं? यहां हमारा पहला एपिसोड देखें!

टास्क शेड्यूल करने के सबसे सही तरीके

एपिसोड 1: मॉन्ट्रियाल, पीक्यू में गैब्रिएल शैरेट का (अप्रैल, 2019)
पिछले एपिसोड

जिस Chrome कोड को प्रोसेस में एसिंक्रोनस तरीके से एक्ज़ीक्यूशन की ज़रूरत होती है उसके लिए आम तौर पर टास्क पोस्ट किए जाते हैं तक ले जाते हैं. क्रम, Chrome से मैनेज किए जाने वाले "वर्चुअल थ्रेड" होते हैं और हैं मुझे खुद थ्रेड बनाना चाहिए. कोई ऑब्जेक्ट कैसे काम करता है तो पता है कि किस क्रम में पोस्ट करना है?

यह न करें

इस पुराने मॉडल में, क्रिएटर से SequencedTaskRunner जुड़ा है:

Foo::Foo(scoped_refptr backend_task_runner)
    : backend_task_runner_(std::move(backend_task_runner)) {}
यह करें

हमारा पसंदीदा मॉडल एक इंडिपेंडेंट SequencedTaskRunner बनाना है:

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

इसे पढ़ना और लिखना आसान है, क्योंकि यहां दी गई सारी जानकारी स्थानीय है और अलग-अलग तरह के टास्क पर निर्भरता का कोई खतरा नहीं होता.

जब बात जांच की हो, तब यह मॉडल बेहतर साबित होता है. इंजेक्ट करने के बजाय टास्क रनर मैन्युअल तौर पर किए जाते हैं, तो टेस्ट कंट्रोल्ड टास्क एनवायरमेंट को तुरंत ट्रिगर कर सकते हैं फ़ू के टास्क मैनेज करने के लिए:

class FooTest : public testing::Test {
 public
  (...)
 protected:
  base::test::TaskEnvironment task_environment_;
  Foo 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());
}

यह RunसमयIdle() को प्राथमिकता दी जाती है, जो एसिंक्रोनस होने पर अस्थिर हो सकता है वर्कलोड में ऐसा टास्क शामिल होता है जो TaskEnvironment के दायरे से बाहर का होता है, उदाहरण के लिए, सिस्टम इवेंट है, इसलिए RunUntilIdle() का इस्तेमाल सावधानी से करें.

क्या आपको इस बारे में ज़्यादा जानकारी चाहिए? थ्रेडिंग और टास्क पर हमारा दस्तावेज़ पढ़ें या TaskEnvironment पर माइग्रेट करने में शामिल हों!