Chromium Chronicle #1: แนวทางปฏิบัติแนะนำสำหรับการกำหนดเวลางาน

ทีม Chrome ภูมิใจนำเสนอ Chromium Chronicle ซึ่งเป็น ที่ออกแบบมาเพื่อนักพัฒนาซอฟต์แวร์ของ Chromium โดยเฉพาะ รวมถึงนักพัฒนาซอฟต์แวร์ที่สร้าง เบราว์เซอร์

Chromium Chronicle จะเน้นการเผยแพร่ความรู้ทางเทคนิคเป็นหลัก และแนวทางปฏิบัติแนะนำในการเขียน สร้าง และทดสอบ Chrome เรามีแผนจะเพิ่ม หัวข้อที่เกี่ยวข้องและเป็นประโยชน์ต่อนักพัฒนาซอฟต์แวร์ Chromium เช่น โค้ด สุขภาพ เครื่องมือที่มีประโยชน์ การทดสอบหน่วย การเข้าถึงได้ง่าย และอื่นๆ อีกมากมาย แต่ละบทความ จะเขียนและแก้ไขโดยวิศวกร Chrome

เรารู้สึกตื่นเต้นกับซีรีส์ใหม่นี้และหวังว่าคุณจะรู้สึกเหมือนกัน พร้อมเจาะลึกแล้วหรือยัง ลองดูตอนแรกได้ที่ด้านล่าง

แนวทางปฏิบัติแนะนำสำหรับการกำหนดเวลางาน

ตอนที่ 1: โดย Gabriel Charette ในเมืองมอนทรีออล รัฐ PQ (เมษายน 2019)
ตอนก่อนหน้า

โค้ด 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 สภาพแวดล้อมของงาน จะบันทึกคำขอของ 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() ซึ่งอาจทำให้เกิดการไม่สม่ำเสมอได้ถ้าแบบอะซิงโครนัส ซึ่งเกี่ยวข้องกับงานที่อยู่นอกขอบเขตขอบเขตงาน เช่น เหตุการณ์ของระบบ ดังนั้นโปรดใช้ RunUntilIdle() ด้วยความระมัดระวัง

หากต้องการดูข้อมูลเพิ่มเติม อ่านเอกสารของเราเกี่ยวกับการจัดชุดข้อความและงาน หรือมีส่วนร่วมในการย้ายข้อมูลไปยัง Task Environment