ในการเขียนโปรแกรมแบบอะซิงโครนัสใน Rust จะใช้แนวคิดของฟิวเจอร์เพื่อแสดงการดำเนินการที่อาจใช้เวลานานและอาจไม่เสร็จสมบูรณ์ในทันที ฟีเจอร์เหล่านี้ ต้องมีกลไกในการขับเคลื่อนการดำเนินการและทำให้เสร็จสมบูรณ์ ซึ่งเป็นจุดที่ AsyncExecutor เข้ามามีบทบาท
ตัวดำเนินการแบบไม่พร้อมกันมีหน้าที่จัดการและเรียกใช้ Future เหล่านี้ โดยจะ มีสภาพแวดล้อมที่สามารถตั้งเวลาอนาคต ทำการสำรวจความคืบหน้า และ ในที่สุดก็ทำให้เสร็จสมบูรณ์ได้ ลองนึกถึงว่ามันเป็นตัวจัดระเบียบที่จัดการความซับซ้อนของงานแบบอะซิงโครนัส ซึ่งช่วยให้โค้ดของคุณยังคงตอบสนองและมีประสิทธิภาพ
Rust มีตัวดำเนินการแบบอะซิงโครนัสหลายตัว ซึ่งแต่ละตัวก็มีจุดแข็งและ ลักษณะเฉพาะของตัวเอง
ตัวดำเนินการแบบอะซิงโครนัส
การเลือกตัวดำเนินการสำหรับบริการ Rust ขึ้นอยู่กับลักษณะของภาระงานเป็นอย่างมาก แม้ว่า Tokio จะเป็นรันไทม์แบบอะซิงโครนัสที่มีประสิทธิภาพ แต่ก็อาจไม่ใช่โซลูชันที่เหมาะสมที่สุดสำหรับทุกสถานการณ์
สำหรับบริการที่ดำเนินการตามลำดับเป็นหลัก การใช้รันไทม์แบบอะซิงโครนัส เช่น Tokio อาจทำให้เกิดค่าใช้จ่ายที่ไม่จำเป็นโดยไม่ได้เพิ่มประสิทธิภาพอย่างมีนัยสำคัญ ในกรณีเช่นนี้ ตัวดำเนินการแบบเธรดเดียว อาจเป็นตัวเลือกที่เหมาะสมและมีน้ำหนักเบากว่า วิธีนี้จะช่วยให้ฐานของโค้ดง่ายขึ้นและลดการใช้ทรัพยากร
กำหนดค่าเทรดของ Worker
เมื่อต้องจัดการกับบริการที่มีการดำเนินการพร้อมกันหรือแบบอะซิงโครนัสโดยธรรมชาติ การใช้ประโยชน์จากความสามารถของรันไทม์แบบอะซิงโครนัส เช่น Tokio จึงมีความสำคัญอย่างยิ่ง หากต้องการเพิ่มประสิทธิภาพในสถานการณ์เหล่านี้ ให้กำหนดค่า รันไทม์ให้ใช้จำนวนเทรดของ Worker ที่ตรงกับจำนวนแกน CPU ที่มีในระบบ ซึ่งช่วยให้รันไทม์กระจายภาระงานได้อย่างมีประสิทธิภาพและใช้ประโยชน์จากกำลังประมวลผลที่มีอยู่ได้อย่างเต็มที่
พิจารณาสภาพแวดล้อมของระบบโดยรวมเมื่อกำหนดค่าเธรดของ Worker หากมีบริการหลายรายการทำงานอยู่บนเครื่องเสมือนเดียวกัน ให้ปรับ จำนวนเธรดของ Worker ต่อบริการเพื่อป้องกันการใช้งาน CPU มากเกินไป และตรวจสอบว่า มีการจัดสรรทรัพยากรอย่างเท่าเทียมกันในกระบวนการที่ใช้งานอยู่ทั้งหมด
การดำเนินการบล็อก
การตรวจสอบว่าเธรดของ Worker ภายในรันไทม์แบบไม่พร้อมกันไม่ถูกบล็อกโดยการดำเนินการที่ใช้เวลานานหรือการดำเนินการแบบซิงโครนัสเป็นสิ่งสำคัญอย่างยิ่ง การบล็อกเธรดของ Worker อาจขัดขวางความสามารถของรันไทม์ในการประมวลผลงานที่เข้ามาและรักษาการตอบสนองอย่างรุนแรง
หากฟังก์ชันที่ทำงานในเทรดผู้ปฏิบัติงานต้องดำเนินการที่บล็อก ให้ใช้ tokio::spawn_blocking ฟังก์ชันนี้จะส่งต่อการบล็อก
ไปยังพูลเธรดแยกที่ออกแบบมาโดยเฉพาะสำหรับงานดังกล่าว
เพื่อป้องกันไม่ให้เกิดการหยุดชะงักของเธรดงานแบบอะซิงโครนัส และรับประกัน
การตอบสนองโดยรวมของบริการ