Chromium Chronicle #1: Các phương pháp hay nhất để lên lịch công việc

Nhóm Chrome rất tự hào giới thiệu Chromium Chronicle, dành riêng cho các nhà phát triển Chromium, những nhà phát triển tạo ra trình duyệt.

Chromium Chronicle chủ yếu sẽ tập trung vào việc truyền bá kiến thức kỹ thuật và các phương pháp hay nhất để viết, tạo và thử nghiệm Chrome. Kế hoạch của chúng tôi là giới thiệu nổi bật chủ đề có liên quan và hữu ích với nhà phát triển Chromium, chẳng hạn như mã sức khoẻ, công cụ hữu ích, kiểm thử đơn vị, khả năng tiếp cận và nhiều tính năng khác! Mỗi bài viết do các kỹ sư Chrome viết và chỉnh sửa.

Chúng tôi rất hào hứng với loạt video mới này và hy vọng bạn cũng vậy! Bạn đã sẵn sàng tìm hiểu sâu hơn chưa? Hãy xem tập đầu tiên của chúng tôi dưới đây!

Các phương pháp hay nhất để lên lịch công việc

Tập 1: của Gabriel Charette ở Montréal, PQ (tháng 4 năm 2019)
Các tập trước

Mã Chrome cần thực thi không đồng bộ trong quy trình thường đăng các tác vụ trình tự. Trình tự là "luồng ảo" do Chrome quản lý và nên tạo chuỗi bài đăng của riêng mình. Một đối tượng như thế nào bạn biết trình tự nào để đăng?

Không nên

Mô hình cũ là nhận SequencedTaskRunner từ trình tạo:

Foo::Foo(scoped_refptr backend_task_runner)
    : backend_task_runner_(std::move(backend_task_runner)) {}
Nên

Mô hình ưu tiên là tạo một SequencedTaskRunner độc lập:

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

Loại dữ liệu này dễ đọc và dễ ghi hơn vì tất cả thông tin đều là thông tin địa phương và có không có nguy cơ phụ thuộc lẫn nhau với các nhiệm vụ không liên quan.

Mô hình này cũng hiệu quả hơn khi thử nghiệm. Thay vì chèn trình chạy tác vụ theo cách thủ công, các bài kiểm thử có thể tạo thực thể cho một môi trường tác vụ được kiểm soát để quản lý công việc của Foo:

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

Việc đặt TaskTask đầu tiên trong môi trường cố định sẽ đảm bảo tác vụ đó một cách tự nhiên quản lý môi trường tác vụ trong suốt thời gian hoạt động của Foo. Môi trường tác vụ sẽ ghi lại yêu cầu xây dựng của Foo để tạo SequencedTaskRunner và sẽ quản lý các nhiệm vụ của mình trong mỗi FooTest.

Để kiểm tra kết quả của quá trình thực thi không đồng bộ, hãy sử dụng Mô hình RunLoop::Run()+QuitClosure():

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

Phương thức này được ưu tiên hơn RununtilIdle(), mà có thể không ổn định nếu hàm không đồng bộ khối lượng công việc này liên quan đến một nhiệm vụ nằm ngoài mục đích của TaskEnvironment, ví dụ: sự kiện hệ thống, vì vậy, hãy cẩn thận khi sử dụng RunUntilIdle().

Bạn muốn tìm hiểu thêm? Đọc tài liệu của chúng tôi về luồng và tác vụ hoặc tham gia vào quá trình di chuyển sang TaskEnvironment!