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

Chrome팀은 월간 업데이트인 Chromium Chronicle을 소개하게 되어 자랑스럽게 생각합니다 특히 Chromium 개발자, 웹 브라우저 기반 도구를 빌드하는 개발자를 위해 있습니다.

Chromium Chronicle은 주로 기술 지식 전파에 중점을 둡니다. Chrome 작성, 빌드, 테스트에 관한 권장사항을 확인하세요. Google Cloud는 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로의 마이그레이션에 참여해 보세요.