8.16. סיכום

עברתם על ה-API של asyncio – החלקים שסקריפט זקוק להם כדי להריץ מספר משימות במקביל על מעבד יחיד:

  • תזמון שיתופי – המודל שעליו נשארת שאר המודול נשענת. הקורוטינה הרצה מחזיקה בלולאה לעצמה עד שהיא מבצעת await; החלפות קורות רק ב-awaits אלה.

  • קורוטינות ומשימותasync def מגדיר יחידת עבודה; asyncio.create_task() מתזמן אחת במקביל ומחזיר Task שהיישום יכול מאוחר יותר להמתין עליה, לבטל אותה, או לזהות אותה.

  • לולאת האירועים – המנוע שמריץ קורוטינות ומשימות. asyncio.run() היא נקודת הכניסה היחידה שרוב הסקריפטים זקוקים לה; המחלקה Loop חושפת את השאר עבור המקרים הנדירים שזקוקים לכך.

  • תיאוםgather() עבור פיזור וכינוס, wait_for() עבור מועדים אחרונים, Task.cancel ודפוס הניקוי של סעיף ה-finally, התפשטות חריגות דרך משימות וקריאות gather, ומסעף מטפל החריגות של הלולאה.

  • פרימיטיבים לסנכרוןEvent לאיתות בין קורוטינות, Lock לטיריאליזציה של גישה למשאב משותף לאורך awaits, ו-ThreadSafeFlag להערת משימת asyncio ממטפל פסיקה.

  • אובייקטים אסינכרוניים מותאמים אישית – מסעפי השפה שמאפשרים למחלקות יישום להשתלב במטבעות הלשון של asyncio. __await__ עבור אובייקטים שהם עצמם יעד של await, __aiter__ / __anext__ עבור async for, ו-__aenter__ / __aexit__ עבור async with.

  • לכידת פריימים – העוטף שהופך את csi.CSI.snapshot() לקורוטינה ידידותית ל-await, כך שלולאת לכידה רצה לצד עבודת asyncio אחרת.

  • מהמורותawait-ים נשכחים, לולאות צפופות ללא מסירת שליטה, ביטולים שנבלעו, מצב משותף ששונה לאורך awaits, ושאר המלכודות הספציפיות ל-asyncio.

זה מספיק כדי לכתוב תוכניות שמשלבות עבודת מצלמה, קלט/פלט חומרה, ועבודת רקע מקבילה על אותה הלולאה.

8.16.1. שימוש במדריך זה בהמשך

התייחסו לפרקי asyncio כחומר עזר; חזרה לבדוק את צורת ה-async with או את ההתנהגות המדויקת של gather() בכשל של משימת אח היא השימוש המיועד. עמוד העזר של המודול asyncio מפרט כל פונקציה ומחלקה במקום אחד כשהשאלה היא פשוט ”מה השם המדויק של הקריאה הזו“.

עבור פרימיטיבים עשירים יותר הבנויים על גבי המודול – סמפורים, תורים, מחסומים, ואוסף ניכר של עוזרים בצורת יישום – המאגר peterhinch/micropython-async הוא המקור הסטנדרטי המתוחזק על ידי הקהילה.

8.16.2. לאן ממשיכים מכאן

רשתות הוא הנושא המרכזי הבא. asyncio.open_connection(), asyncio.start_server(), והמחלקה Stream הם הדרך שבה סקריפט asyncio מדבר עם שאר הרשת מתוך קורוטינה, יחד עם המודולים network ו-socket שמתחתם. כל מה שלמדתם על await, Task, ביטול, ופרימיטיבי הסנכרון עובר ישירות הלאה.