asyncio — מתזמן קלט/פלט אסינכרוני

מודול זה מספק מתזמן ריבוי-משימות שיתופי עבור קורוטינות async/await, יחד עם פרימיטיבים לסנכרון (מנעולים, אירועים) ועבודה לא-חוסמת ברשת TCP באמצעות קוראי וכותבי זרמים. משימות רצות במקביל על לולאת אירועים יחידה; המשימה הרצה כעת מחזירה את השליטה ללולאה באמצעות await.

דוגמה:

import asyncio

async def blink(led, period_ms):
    while True:
        led.on()
        await asyncio.sleep_ms(5)
        led.off()
        await asyncio.sleep_ms(period_ms)

async def main(led1, led2):
    asyncio.create_task(blink(led1, 700))
    asyncio.create_task(blink(led2, 400))
    await asyncio.sleep_ms(10_000)

# Running on an OpenMV Cam
from machine import LED
asyncio.run(main(LED(1), LED(2)))

פונקציות ליבה

asyncio.create_task(coro: Coroutine) Task

יצירת משימה חדשה מתוך הקורוטינה הנתונה ותזמונה לריצה.

מחזירה את אובייקט Task המתאים.

asyncio.current_task() Task

מחזירה את אובייקט Task המשויך למשימה הרצה כעת.

asyncio.run(coro: Coroutine) Any

יצירת משימה חדשה מתוך הקורוטינה הנתונה והרצתה עד להשלמתה.

מחזירה את הערך שהוחזר על ידי coro.

asyncio.sleep(t: float) None

שינה למשך t שניות (יכול להיות מספר עשרוני).

זוהי קורוטינה.

asyncio.sleep_ms(t: int) None

שינה למשך t מילישניות.

זוהי קורוטינה, והרחבה של MicroPython.

פונקציות נוספות

asyncio.wait_for(awaitable: Awaitable, timeout: float) Any

המתנה להשלמת awaitable, אך ביטולו אם הוא נמשך יותר מ-timeout שניות. אם awaitable אינו משימה, תיווצר ממנו משימה.

אם מתרחש timeout, היא מבטלת את המשימה ומעלה asyncio.TimeoutError: על הקורא לתפוס חריגה זו. המשימה מקבלת asyncio.CancelledError אשר ניתן להתעלם ממנה או לתפוס אותה באמצעות try...except או try...finally כדי להריץ קוד ניקוי.

מחזירה את ערך ההחזרה של awaitable.

זוהי קורוטינה.

asyncio.wait_for_ms(awaitable: Awaitable, timeout: int) Any

דומה ל-wait_for() אך timeout הוא מספר שלם במילישניות.

זוהי קורוטינה, והרחבה של MicroPython.

asyncio.gather(*awaitables, return_exceptions: bool = False) List

הרצת כל ה-awaitables במקביל. כל awaitables שאינם משימות מקודמים למשימות.

מחזירה רשימה של ערכי ההחזרה של כל ה-awaitables.

זוהי קורוטינה.

class Task

class asyncio.Task

אובייקט זה עוטף קורוטינה למשימה רצה. ניתן להמתין למשימות באמצעות await task, מה שימתין להשלמת המשימה ויחזיר את ערך ההחזרה שלה.

אין ליצור משימות באופן ישיר, אלא יש להשתמש ב-create_task() כדי ליצור אותן.

cancel() None

ביטול המשימה על ידי הזרקת asyncio.CancelledError לתוכה. המשימה עשויה להתעלם מחריגה זו. ניתן להריץ קוד ניקוי על ידי תפיסתה, או באמצעות try ... finally.

class Event

class asyncio.Event

יצירת אירוע חדש שניתן להשתמש בו לסנכרון משימות. אירועים מתחילים במצב מנוקה.

is_set() bool

מחזירה True אם האירוע מוגדר, False אחרת.

set() None

הגדרת האירוע. כל המשימות הממתינות לאירוע יתוזמנו לריצה.

הערה: יש לקרוא לזה מתוך משימה. אין זה בטוח לקרוא לזה מתוך IRQ, פונקציית callback של המתזמן, או חוט אחר. ראו ThreadSafeFlag.

clear() None

ניקוי האירוע.

wait() None

המתנה להגדרת האירוע. אם האירוע כבר מוגדר, היא חוזרת מיד.

זוהי קורוטינה.

class ThreadSafeFlag

class asyncio.ThreadSafeFlag

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

set() None

הגדרת הדגל. אם קיימת משימה הממתינה לדגל, היא תתוזמן לריצה.

clear() None

ניקוי הדגל. ניתן להשתמש בזה כדי לוודא שדגל שאולי הוגדר קודם לכן מנוקה לפני ההמתנה לו.

wait() None

המתנה להגדרת הדגל. אם הדגל כבר מוגדר, היא חוזרת מיד. הדגל מאופס אוטומטית עם החזרה מ-wait.

דגל יכול להיות מומתן על ידי משימה אחת בלבד בכל זמן נתון.

זוהי קורוטינה.

class Lock

class asyncio.Lock

יצירת מנעול חדש שניתן להשתמש בו לתיאום משימות. מנעולים מתחילים במצב לא-נעול.

בנוסף למתודות שלהלן, ניתן להשתמש במנעולים במשפט async with.

locked() bool

מחזירה True אם המנעול נעול, אחרת False.

acquire() bool

המתנה לכך שהמנעול יהיה במצב לא-נעול ואז נעילתו באופן אטומי. רק משימה אחת יכולה לרכוש את המנעול בכל זמן נתון.

זוהי קורוטינה.

release() None

שחרור המנעול. אם משימות כלשהן ממתינות למנעול, הבאה בתור מתוזמנת לריצה והמנעול נשאר נעול. אחרת, אין משימות ממתינות והמנעול הופך ללא-נעול.

חיבורי זרם TCP

asyncio.open_connection(host: str, port: int, ssl: ssl.SSLContext | bool | None = None) Tuple[Stream, Stream]

פתיחת חיבור TCP אל ה-host וה-port הנתונים. כתובת ה-host תיפתר באמצעות socket.getaddrinfo(), שהיא כרגע קריאה חוסמת. אם ssl הוא אובייקט ssl.SSLContext, הקשר הזה משמש ליצירת ערוץ התעבורה; אם ssl הוא True, נעשה שימוש בקשר ברירת מחדל.

מחזירה זוג זרמים: זרם קורא וזרם כותב. תעלה OSError ייחודי ל-socket אם לא ניתן היה לפתור את ה-host או אם לא ניתן היה ליצור את החיבור.

זוהי קורוטינה.

asyncio.start_server(callback: Callable, host: str, port: int, backlog: int = 5, ssl: ssl.SSLContext | None = None) Server

הפעלת שרת TCP על ה-host וה-port הנתונים. תתבצע קריאה ל-callback עבור חיבורים נכנסים שהתקבלו, ויועברו לה 2 ארגומנטים: זרם קורא וזרם כותב עבור החיבור.

אם ssl הוא אובייקט ssl.SSLContext, הקשר הזה משמש ליצירת ערוץ התעבורה.

מחזירה אובייקט Server.

זוהי קורוטינה.

class asyncio.Stream

זה מייצג חיבור זרם TCP. כדי למזער קוד, מחלקה זו מממשת גם קורא וגם כותב, וגם StreamReader וגם StreamWriter הם כינויים למחלקה זו.

get_extra_info(v: str) Any

קבלת מידע נוסף על הזרם, הנתון על ידי v. הערכים החוקיים עבור v הם: peername.

close() None

סגירת הזרם.

wait_closed() None

המתנה לסגירת הזרם.

זוהי קורוטינה.

read(n: int = -1) bytes

קריאת עד n בתים והחזרתם. אם n אינו מסופק או הוא -1, קריאת כל הבתים עד EOF. הערך המוחזר יהיה אובייקט bytes ריק אם נתקלים ב-EOF לפני שנקראים בתים כלשהם.

זוהי קורוטינה.

readinto(buf: bytearray | memoryview) int

קריאת עד n בתים לתוך buf, כאשר n שווה לאורך של buf.

מחזירה את מספר הבתים שנקראו לתוך buf.

זוהי קורוטינה, והרחבה של MicroPython.

readexactly(n: int) bytes

קריאת בדיוק n בתים והחזרתם כאובייקט bytes.

מעלה חריגת EOFError אם הזרם מסתיים לפני קריאת n בתים.

זוהי קורוטינה.

readline() bytes

קריאת שורה והחזרתה.

זוהי קורוטינה.

write(buf: bytes) None

צבירת buf לחוצץ הפלט. הנתונים נשטפים רק כאשר נקראת Stream.drain(). מומלץ לקרוא ל-Stream.drain() מיד לאחר קריאה לפונקציה זו.

drain() None

שטיפה (כתיבה) של כל נתוני הפלט שבחוצץ אל הזרם.

זוהי קורוטינה.

class asyncio.Server

זה מייצג את מחלקת השרת המוחזרת מ-start_server(). ניתן להשתמש בה במשפט async with כדי לסגור את השרת ביציאה.

close() None

סגירת השרת.

wait_closed() None

המתנה לסגירת השרת.

זוהי קורוטינה.

לולאת אירועים

asyncio.get_event_loop() Loop

מחזירה את לולאת האירועים המשמשת לתזמון והרצת משימות. ראו Loop.

asyncio.new_event_loop() Loop

איפוס לולאת האירועים והחזרתה.

הערה: מאחר של-MicroPython יש לולאת אירועים יחידה בלבד, פונקציה זו רק מאפסת את מצב הלולאה, היא אינה יוצרת לולאה חדשה.

class asyncio.Loop

זה מייצג את האובייקט המתזמן ומריץ משימות. לא ניתן ליצור אותו, השתמשו ב-get_event_loop() במקום זאת.

create_task(coro: Coroutine) Task

יצירת משימה מתוך ה-coro הנתון והחזרת אובייקט Task החדש.

run_forever() None

הרצת לולאת האירועים עד שנקראת stop().

run_until_complete(awaitable: Awaitable) Any

הרצת ה-awaitable הנתון עד להשלמתו. אם awaitable אינו משימה, הוא יקודם למשימה.

stop() None

עצירת לולאת האירועים.

close() None

סגירת לולאת האירועים.

set_exception_handler(handler: Callable) None

הגדרת מטפל החריגות שייקרא כאשר משימה מעלה חריגה שאינה נתפסת. על ה-handler לקבל שני ארגומנטים: (loop, context).

get_exception_handler() Callable | None

קבלת מטפל החריגות הנוכחי. מחזירה את המטפל, או None אם לא הוגדר מטפל מותאם אישית.

default_exception_handler(context: dict) None

מטפל החריגות שבברירת מחדל נקרא.

call_exception_handler(context: dict) None

קריאה למטפל החריגות הנוכחי. הארגומנט context מועבר כפי שהוא והוא מילון המכיל את המפתחות: 'message', 'exception', 'future'.