Chromium Chronicle #1: 작업 예약 권장사항

Chrome팀은 브라우저를 빌드하는 Chromium 개발자를 위한 월간 시리즈인 Chromium Chronicle을 소개하게 되어 기쁩니다.

Chromium Chronicle은 주로 Chrome 작성, 빌드, 테스트에 관한 기술 지식과 권장사항을 전파하는 데 중점을 둡니다. Google의 계획은 코드 상태, 유용한 도구, 단위 테스트, 접근성 등 Chromium 개발자와 관련성이 높고 유용한 주제를 제공할 계획입니다. 각 문서는 Chrome 엔지니어가 작성하고 수정합니다.

Google에서는 이 새로운 시리즈를 매우 기대하고 있습니다. 여러분도 함께 해주시기를 바랍니다. 탐험할 준비가 되셨나요? 아래에서 첫 번째 에피소드를 확인하세요.

작업 예약 권장사항

에피소드 1: PQ 몬트리올의 Gabriel Charette (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());
}

비동기 워크로드가 TaskEnvironment의 범위 외부의 작업(예: 시스템 이벤트)을 포함하는 경우 불안정할 수 있는 RunUntilIdle()보다 선호되므로 RunUntilIdle()를 주의해서 사용해야 합니다.

자세한 내용이 궁금하신가요? 스레딩 및 작업에 관한 문서를 읽거나 TaskEnvironment로 이전에 참여하세요.