Chromium Chronicle #1:安排工作排程的最佳做法

Chrome 團隊隆重推出每月 Chromium Chronicle 介紹 專為打造 。

Chromium Chronicle 主要著重於傳播技術知識 以及編寫、建構及測試 Chrome 的最佳做法我們的計畫 與 Chromium 開發人員切身相關且實用的主題,例如程式碼 健康、實用工具、單元測試、無障礙功能等等!每篇文章 ,這個檔案將由 Chrome 工程師編寫及編輯。

我們很期待這個新系列影片,希望你和我們一樣!準備好探索地球了嗎? 歡迎收看下方的第一集影片!

工作排程最佳做法

第 1 集:作者:蒙特婁 Gabriel Charette,PQ (2019 年 4 月)
上一集

需要進行中非同步執行作業的 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})) {}

因為所有資訊都是本機資訊,所以更容易閱讀及寫入 不會有與不相關的工作相互依賴的風險。

這種模式也比較適合測試。非插入 工作執行器手動,測試可以對受控管的工作環境執行個體化 管理 Foo 的工作:

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

TaskEnvironment 先在固件中自然可確保 管理 Foo 生命週期的任務環境。TaskEnvironment 會擷取 Foo 的在建構期間要求建立 SequencedTaskRunner 會在每個 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(),如果非同步函式 工作負載涉及 TaskEnvironment 範圍外的工作 例如:發生系統事件,因此請謹慎使用 RunUntilIdle()

想要瞭解詳情嗎?參閱執行緒和工作說明文件 或參與遷移至 TaskEnvironment