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

Chrome ekibi, aylık yayınlanan Chromium Chronicle'ı sunmaktan gurur duyuyor özel olarak Chromium geliştiricilerine yönelik video serisi, emin olun.

Chromium Chronicle öncelikli olarak teknik bilgiyi yaymaya odaklanacaktır ve en iyi uygulamaları açıkladık. Planımız, kod gibi Chromium geliştiricileri için alakalı ve yararlı konular sağlık, faydalı araçlar, birim testi, erişilebilirlik ve çok daha fazlası! Her bir makale Chrome mühendisleri tarafından yazılacak ve düzenlenecek.

Bu yeni seri bizi heyecanlandırıyor. 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 atın!

Görev Planlamayla İlgili En İyi Uygulamalar

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

İşlem içinde eşzamansız yürütme gerektiren Chrome kodu genellikle görevleri yayınlar yardımcı olur. Adım sıraları, Chrome tarafından yönetilen "sanal iş parçacıklarıdır" ve kendi ileti dizinizi oluşturmayı tercih edebilirsiniz. Bir nesne hangi dizide yayın yapacağınızı biliyor musunuz?

Yapılmaması gerekenler:

Eski paradigma, 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 bu bilgiler yerel düzeyde olduğundan, okunması ve yazılması daha kolaydır. ve birbiriyle ilişkili olmayan görevlerle bağımlılık riski yoktur.

Bu paradigma, testler söz konusu olduğunda da daha iyidir. Enjekte etmek yerine manuel olarak bağlandığı için, testler kontrollü bir görev ortamı oluşturabilir. yönetmek için:

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

TaskEnvironment'ın doğal olarak ilk sırada yer alması, görev ortamını Foo’nun yaşamı boyunca yönetir. TaskEnvironment Foo'nun bir SequencedTaskRunner oluşturma isteğini yakalar ve her FooTest altında yönetmesini sağlar.

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

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

Bu, eşzamansız İş yükü, TaskEnvironment’ın kapsamı dışında bir görev içerir. ör. Bu nedenle, RunUntilIdle() özelliğini kullanırken dikkatli olun.

Daha fazla bilgi edinmek ister misiniz? İleti dizisi ve görevler ile ilgili dokümanlarımızı okuyun veya TaskEnvironment'a taşıma işlemine katılın!