Chromium Chronicle #1: Görev Planlamayla İlgili En İyi Uygulamalar

Chrome ekibi, tarayıcıyı oluşturan Chromium geliştiricilerine ve geliştiricilerine yönelik aylık bir seri olan Chromium Chronicle'ı tanıtmaktan gurur duyar.

Chromium Chronicle öncelikli olarak Chrome'u yazmak, oluşturmak ve test etmek için teknik bilgi ve en iyi uygulamaları yaymaya odaklanacaktır. Planımız, Chromium geliştiricileri için alakalı ve faydalı konuları (örneğin, kod sağlığı, faydalı araçlar, birim testi, erişilebilirlik ve çok daha fazlası) öne çıkarmaktır. Her makale Chrome mühendisleri tarafından yazılacak ve düzenlenecektir.

Bu yeni seriyi heyecanla bekliyoruz. Umarız siz de heyecanlısınızdır. Başlamaya hazır mısınız? İlk bölümümüze aşağıdan göz atabilirsiniz.

Görev Planlaması En İyi Uygulamaları

Bölüm 1: - Gabriel Charette in Montréal, PQ (Nisan 2019)
Önceki bölümler

İşlem sırasında eşzamansız yürütme gerektiren Chrome kodları genellikle görevleri adım sıralarına gönderir. Diziler, Chrome tarafından yönetilen "sanal iş parçacıklarıdır" ve kendi iş parçanızı oluşturmanız tercih edilir. Bir nesne hangi diziye yayın yapacağını nasıl bilir?

Yapılmaması gerekenler

Eski yöntem, içerik üreticiden bir SequencedTaskRunner almaktır:

Foo::Foo(scoped_refptr backend_task_runner)
    : backend_task_runner_(std::move(backend_task_runner)) {}
Yapılması gerekenler

Tercih edilen paradigma, bağımsız bir SequencedTaskRunner oluşturmaktır:

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

Tüm bilgiler yerel olduğundan ve alakasız görevlerde birbirlerine bağımlılık riski olmadığından bu kısmın okunması ve yazılması daha kolaydır.

Bu paradigma test söz konusu olduğunda da daha iyidir. Testler, görev yürütücülerini manuel olarak eklemek yerine Foo'nun görevlerini yönetmek için kontrollü bir görev ortamı başlatabilir:

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

TaskEnvironment'ın temelde olması doğal olarak Foo'nun ömrü boyunca görev ortamını yönetmesini sağlar. TaskEnvironment, bir SequencedTaskRunner oluşturmak için Foo'nun oluşturma isteğini yakalar ve her FooTest altındaki görevleri yönetir.

Eşzamansız yürütmenin sonucunu test etmek için RunLoop::Run()+QuitClosure() paradigmasını kullanın:

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

Bu, eşzamansız iş yükü bir sistem etkinliği gibi TaskEnvironment'ın kapsamı dışında bir görev içeriyorsa kesintili olabilen RunUntilIdle() için tercih edilir. Bu nedenle, RunUntilIdle() kullanırken dikkatli olun.

Daha fazla bilgi edinmek ister misiniz? İş parçacığı ve görevler ile ilgili dokümanlarımızı okuyun veya TaskEnvironment'a geçiş sürecine dahil olun.