8. Asyncio

עד כה כל סקריפט במדריך היה סדרתי – שורה אחת רצה בכל פעם, וקריאה שצריכה להמתין (קריאת חיישן, סבב הלוך-ושוב ברשת, תמונת בזק (snapshot)) חוסמת את הסקריפט עד שהיא מסתיימת. זה עובד כל עוד יש רק דבר אחד לעשות. ברגע שאפליקציה צריכה לעשות מספר דברים בו-זמנית – להריץ לולאת תמונות בזק וגם לענות לפקודה טורית, וגם להעלות פריימים ברשת – סקריפט סדרתי קורס. הקריאה האיטית הראשונה עוצרת את כל השאר מלהתקדם.

המודול asyncio הוא התשובה של MicroPython. הוא מאפשר לאפליקציה לתאר מספר משימות כקורוטינות נפרדות ומריץ אותן במקביל על חוט (thread) יחיד, באופן שיתופי – הקורוטינה שרצה כעת מוסרת שליטה בחזרה למתזמן בכל פעם שעליה להמתין. לולאת תמונות בזק, קורא UART ולקוח רשת יכולים כולם לחיות באותו סקריפט, והחלקים האיטיים של האחד כבר אינם מקפיאים את האחרים.

העמודים הבאים מכסים את מילות המפתח async/await ואת מחזור החיים של Task, תיאום באמצעות gather() ו-wait_for(), ביטול והפצת חריגות, שלושת הפרימיטיבים המובנים לסנכרון (Event, Lock, ThreadSafeFlag), הוקי השפה לחיבור מחלקות אפליקציה לניבים של asyncio, עוטף CSI קטן שמאפשר ל-snapshot() לרוץ כקורוטינה, והמלכודות הנפוצות הנלוות לתזמון שיתופי.

פרימיטיבים לסנכרון

בקרת לולאה

לכידת פריימים

מלכודות

סיכום