asyncio --- ตัวกำหนดเวลา I/O แบบอะซิงโครนัส¶
โมดูลนี้ให้ตัวกำหนดเวลาแบบ cooperative-multitasking สำหรับคอร์รูทีน async/await พร้อมกับโครงสร้างพื้นฐานสำหรับการซิงโครไนซ์ (ล็อก, อีเวนต์) และการเชื่อมต่อเครือข่าย TCP แบบไม่บล็อกผ่าน stream reader และ writer งานต่าง ๆ ทำงานพร้อมกันบน event loop เดียว โดยงานที่กำลังรันอยู่จะส่งคืนการควบคุมกลับไปยัง loop ด้วย 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.run(coro: Coroutine) Any¶
สร้างงานใหม่จากคอร์รูทีนที่กำหนดและรันจนเสร็จสมบูรณ์
คืนค่าที่ coro ส่งคืน
ฟังก์ชันเพิ่มเติม¶
- 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
class Task¶
- class asyncio.Task¶
อ็อบเจกต์นี้ห่อหุ้มคอร์รูทีนไว้ในงานที่รันอยู่ งานสามารถรอด้วย
await taskซึ่งจะรอให้งานเสร็จสมบูรณ์และคืนค่าส่งคืนของงานไม่ควรสร้างงานโดยตรง ให้ใช้
create_task()ในการสร้างแทน
class Event¶
- class asyncio.Event¶
สร้างอีเวนต์ใหม่ที่สามารถใช้ซิงโครไนซ์งานได้ อีเวนต์เริ่มต้นในสถานะที่ถูกล้าง
- set() None¶
เซ็ตอีเวนต์ งานใดที่รออยู่กับอีเวนต์จะถูกกำหนดเวลาให้รัน
หมายเหตุ: ต้องเรียกใช้จากภายในงาน ไม่ปลอดภัยที่จะเรียกใช้จาก IRQ, scheduler callback หรือเธรดอื่น ดู
ThreadSafeFlag
class ThreadSafeFlag¶
- class asyncio.ThreadSafeFlag¶
สร้างแฟล็กใหม่ที่สามารถใช้ซิงโครไนซ์งานกับโค้ดที่รันนอก asyncio loop เช่น เธรดอื่น, IRQs หรือ scheduler callbacks แฟล็กเริ่มต้นในสถานะที่ถูกล้าง
class Lock¶
การเชื่อมต่อ TCP stream¶
- asyncio.open_connection(host: str, port: int, ssl: ssl.SSLContext | bool | None = None) Tuple[Stream, Stream]¶
เปิดการเชื่อมต่อ TCP ไปยัง host และ port ที่กำหนด ที่อยู่ host จะถูกแก้ไขโดยใช้
socket.getaddrinfo()ซึ่งปัจจุบันเป็นการเรียกแบบบล็อก หาก ssl เป็นอ็อบเจกต์ssl.SSLContextcontext นี้จะถูกใช้สร้าง transport; หาก ssl เป็นTrueจะใช้ context เริ่มต้นคืนค่าเป็นคู่ของ stream: reader stream และ writer stream จะยก
OSErrorเฉพาะซ็อกเก็ตหากไม่สามารถแก้ไขโฮสต์หรือสร้างการเชื่อมต่อได้นี่คือคอร์รูทีน
- asyncio.start_server(callback: Callable, host: str, port: int, backlog: int = 5, ssl: ssl.SSLContext | None = None) Server¶
เริ่ม TCP server บน host และ port ที่กำหนด callback จะถูกเรียกพร้อมการเชื่อมต่อที่เข้ามาและยอมรับ และจะส่ง 2 อาร์กิวเมนต์: reader และ writer stream สำหรับการเชื่อมต่อ
หาก ssl เป็นอ็อบเจกต์
ssl.SSLContextcontext นี้จะถูกใช้สร้าง transportคืนค่าอ็อบเจกต์
Serverนี่คือคอร์รูทีน
- class asyncio.Stream¶
นี่แสดงถึงการเชื่อมต่อ TCP stream เพื่อลดโค้ด คลาสนี้ใช้งานทั้ง reader และ writer และทั้ง
StreamReaderและStreamWriterเป็น alias ของคลาสนี้- get_extra_info(v: str) Any¶
รับข้อมูลเพิ่มเติมเกี่ยวกับ stream ที่กำหนดโดย v ค่าที่ถูกต้องสำหรับ v ได้แก่:
peername
- 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หาก stream สิ้นสุดก่อนอ่านครบ n ไบต์นี่คือคอร์รูทีน
- write(buf: bytes) None¶
สะสม buf ไปยังบัฟเฟอร์เอาต์พุต ข้อมูลจะถูก flush เมื่อเรียก
Stream.drain()เท่านั้น แนะนำให้เรียกStream.drain()ทันทีหลังจากเรียกฟังก์ชันนี้
Event Loop¶
- asyncio.new_event_loop() Loop¶
รีเซ็ต event loop และคืนค่า
หมายเหตุ: เนื่องจาก MicroPython มี event loop เดียว ฟังก์ชันนี้จึงเพียงรีเซ็ตสถานะของ loop ไม่ได้สร้างใหม่
- class asyncio.Loop¶
นี่แสดงถึงอ็อบเจกต์ที่กำหนดเวลาและรันงาน ไม่สามารถสร้างได้ ให้ใช้
get_event_loop()แทน- run_until_complete(awaitable: Awaitable) Any¶
รัน awaitable ที่กำหนดจนเสร็จสมบูรณ์ หาก awaitable ไม่ใช่งานจะถูกยกระดับเป็นงาน
- set_exception_handler(handler: Callable) None¶
ตั้งค่า exception handler ที่จะเรียกเมื่องานยกข้อยกเว้นที่ไม่ถูกดักจับ handler ควรรับสองอาร์กิวเมนต์:
(loop, context)