Asynchronous Rust

ב-Rust, תכנות אסינכרוני מתבסס על הרעיון של futures כדי לייצג פעולות שעלולות להימשך זמן רב ושלא יסתיימו באופן מיידי. ל-futures האלה נדרש מנגנון שיפעיל אותן וישלים אותן. כאן נכנסים לתמונה async executors.

מבצע אסינכרוני אחראי לניהול ולהרצה של האובייקטים האלה מסוג Future. הוא מספק סביבה שבה אפשר לתזמן פעולות עתידיות, לבדוק את ההתקדמות שלהן ולבסוף להשלים אותן. אפשר לחשוב עליו כעל כלי לניהול משימות שמטפל במורכבות של משימות אסינכרוניות, ומאפשר לקוד שלכם להישאר רספונסיבי ויעיל.

ב-Rust יש מגוון של מנהלי ביצוע אסינכרוניים, שלכל אחד מהם יש חוזקות ומאפיינים משלו.

מבצעים אסינכרוניים

הבחירה של מפעיל לשירות Rust תלויה מאוד באופי של עומס העבודה שלו. אמנם Tokio הוא זמן ריצה אסינכרוני רב עוצמה, אבל הוא לא בהכרח הפתרון האופטימלי לכל התרחישים.

בשירותים שמבצעים בעיקר פעולות רציפות, הוספה של זמן ריצה אסינכרוני כמו Tokio עלולה להוסיף תקורה מיותרת בלי לשפר משמעותית את הביצועים. במקרים כאלה, יכול להיות שעדיף להשתמש ב-executor עם שרשור יחיד. הגישה הזו מפשטת את בסיס הקוד ומצמצמת את צריכת המשאבים.

הגדרת Threads עובדים

כשעובדים עם שירותים שיש להם פעולות מקבילות או אסינכרוניות, חשוב להשתמש ביכולות של סביבת ריצה אסינכרונית כמו Tokio. כדי למקסם את הביצועים בתרחישים האלה, צריך להגדיר את זמן הריצה כך שישתמש במספר של שרשורי עובדים שמתאים למספר ליבות המעבד שזמינות במערכת. כך סביבת זמן הריצה יכולה לחלק את עומס העבודה בצורה יעילה ולנצל את מלוא כוח העיבוד הזמין.

כשמגדירים את מספר ה-threads של העובדים, חשוב לקחת בחשבון את סביבת המערכת הכוללת. אם כמה שירותים פועלים באופן פעיל באותה מכונה וירטואלית, צריך להתאים את מספר ה-threads של העובדים לכל שירות כדי למנוע שימוש יתר ב-CPU ולהבטיח הקצאת משאבים הוגנת בין כל התהליכים הפעילים.

פעולות חסימה

חשוב לוודא ששרשורי Worker בסביבת ריצה אסינכרונית אף פעם לא נחסמים על ידי פעולות ארוכות או סינכרוניות. חסימה של שרשור worker עלולה לפגוע באופן משמעותי ביכולת של זמן הריצה לעבד משימות נכנסות ולשמור על היענות.

אם פונקציה שמופעלת בשרשור עובד צריכה לבצע פעולת חסימה, צריך להשתמש ב-tokio::spawn_blocking. הפונקציה הזו מעבירה את פעולת החסימה למאגר שרשורים נפרד שנועד במיוחד למשימות כאלה, וכך מונעת שיבושים בשרשורי העובדים האסינכרוניים ומבטיחה את היענות השירות הכוללת.