Rust MPSC Channels - צ׳אנלים בראסט


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

קיימים בראסט מגוון סוגים של channels שמגיעים ממגוון ספריות (כמו crossbeam, std::mpsc וכו׳). בפוסט אדבר על Tokio Channels, ומתי ואיך נשתמש בהם.

מהם צ׳אנלים?

כשם כן הם - ״ערוצים״ אשר מאפשרים דרך לשלוח נתונים בין חלקים שונים של תוכנה (בדרך כלל בין threads או tasks).

צ׳אנלים מורכבים משני מרכיבים עיקריים: שולח (Sender): החלק ששולח נתונים ומקבל (Receiver): החלק שמקבל נתונים.

MPSC (Multi Producer Singler Consumer)

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

דוגמה פשוטה:


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

במקרים מורכבים יותר (ושכיחים יותר) אנחנו נעביר אובייקט השליחה (tx) למספר tasks/threads ונשלח דרכו מידע במקרים שונים.


בדוגמה הזו ראינו יצירה של שלושה tasks, שירוצו ברקע, כל אחד מהם אחראי על עבודה אחרת (במקרה הזה, להביא מידע ממקור מסוים) ושולח את אותו המידע ל task המעבד לצורך המשך עיבוד.

למה Channels?

- מאפשרים תקשורת בטוחה ובעלת מבנה מסודר של העברת הודעות.
- הפרדת תלויות (decoupling) בין מי שמייצר את המידע למי שמעבד אותו.
- הורדת הצורך ב shared state - ברגע שיש הפרדה בין שולח למקבל המידע עובר בניהם וברוב המקרים לא נראה שיתוף state באמצעות Arc Mutex.
- עמידה בסקייל הופכת לפשוטה יותר ברגע שאפשר להגדיל את מספר ה consumers/producers.

סיכום

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

תגובות

פוסטים פופולריים מהבלוג הזה

מהם קבצי DLL ואיך להשתמש בהם?

מדריך C# | שימוש ב LINQ

תכנות מונחה עצמים | Dependency Inversion Principle