asyncio --- penjadwal I/O asinkron

Modul ini menyediakan penjadwal multitasking kooperatif untuk coroutine async/await, beserta primitif untuk sinkronisasi (kunci, event) dan jaringan TCP non-blokir melalui pembaca dan penulis stream. Tugas-tugas dijalankan secara bersamaan pada satu event loop; tugas yang sedang berjalan mengalihkan kendali kembali ke loop dengan await.

Contoh:

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)))

Fungsi inti

asyncio.create_task(coro: Coroutine) Task

Buat tugas baru dari coroutine yang diberikan dan jadwalkan untuk dijalankan.

Mengembalikan objek Task yang sesuai.

asyncio.current_task() Task

Mengembalikan objek Task yang terkait dengan tugas yang sedang berjalan.

asyncio.run(coro: Coroutine) Any

Buat tugas baru dari coroutine yang diberikan dan jalankan hingga selesai.

Mengembalikan nilai yang dikembalikan oleh coro.

asyncio.sleep(t: float) None

Tidur selama t detik (dapat berupa float).

Ini adalah coroutine.

asyncio.sleep_ms(t: int) None

Tidur selama t milidetik.

Ini adalah coroutine, dan merupakan ekstensi MicroPython.

Fungsi tambahan

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

Tunggu hingga awaitable selesai, tetapi batalkan jika membutuhkan waktu lebih dari timeout detik. Jika awaitable bukan tugas, maka tugas akan dibuat darinya.

Jika batas waktu tercapai, tugas dibatalkan dan pengecualian asyncio.TimeoutError dimunculkan: ini harus ditangkap oleh pemanggil. Tugas menerima asyncio.CancelledError yang dapat diabaikan atau ditangkap menggunakan try...except atau try...finally untuk menjalankan kode pembersihan.

Mengembalikan nilai kembalian dari awaitable.

Ini adalah coroutine.

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

Mirip dengan wait_for() namun timeout adalah bilangan bulat dalam milidetik.

Ini adalah coroutine, dan merupakan ekstensi MicroPython.

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

Jalankan semua awaitables secara bersamaan. Semua awaitables yang bukan tugas akan dipromosikan menjadi tugas.

Mengembalikan daftar nilai kembalian dari semua awaitables.

Ini adalah coroutine.

class Task

class asyncio.Task

Objek ini membungkus coroutine menjadi tugas yang berjalan. Tugas dapat ditunggu menggunakan await task, yang akan menunggu tugas selesai dan mengembalikan nilai kembalian tugas tersebut.

Tugas tidak boleh dibuat secara langsung, gunakan create_task() untuk membuatnya.

cancel() None

Batalkan tugas dengan menyuntikkan asyncio.CancelledError ke dalamnya. Tugas dapat mengabaikan pengecualian ini. Kode pembersihan dapat dijalankan dengan menangkapnya, atau melalui try ... finally.

class Event

class asyncio.Event

Buat event baru yang dapat digunakan untuk menyinkronkan tugas. Event dimulai dalam keadaan tidak aktif.

is_set() bool

Mengembalikan True jika event sudah diset, False jika tidak.

set() None

Set event. Semua tugas yang menunggu event akan dijadwalkan untuk dijalankan.

Catatan: Ini harus dipanggil dari dalam tugas. Tidak aman untuk memanggilnya dari IRQ, callback penjadwal, atau thread lain. Lihat ThreadSafeFlag.

clear() None

Hapus event.

wait() None

Tunggu hingga event diset. Jika event sudah diset maka langsung kembali.

Ini adalah coroutine.

class ThreadSafeFlag

class asyncio.ThreadSafeFlag

Buat flag baru yang dapat digunakan untuk menyinkronkan tugas dengan kode yang berjalan di luar loop asyncio, seperti thread lain, IRQ, atau callback penjadwal. Flag dimulai dalam keadaan tidak aktif.

set() None

Set flag. Jika ada tugas yang menunggu flag, tugas tersebut akan dijadwalkan untuk dijalankan.

clear() None

Hapus flag. Ini dapat digunakan untuk memastikan flag yang mungkin telah diset sebelumnya sudah dihapus sebelum menungguinya.

wait() None

Tunggu hingga flag diset. Jika flag sudah diset maka langsung kembali. Flag secara otomatis direset setelah kembali dari wait.

Sebuah flag hanya dapat ditunggu oleh satu tugas pada satu waktu.

Ini adalah coroutine.

class Lock

class asyncio.Lock

Buat kunci baru yang dapat digunakan untuk mengkoordinasikan tugas. Kunci dimulai dalam keadaan tidak terkunci.

Selain metode di bawah ini, kunci dapat digunakan dalam pernyataan async with.

locked() bool

Mengembalikan True jika kunci terkunci, sebaliknya False.

acquire() bool

Tunggu hingga kunci dalam keadaan tidak terkunci lalu kunci secara atomik. Hanya satu tugas yang dapat mengambil kunci pada satu waktu.

Ini adalah coroutine.

release() None

Lepaskan kunci. Jika ada tugas yang menunggu kunci, tugas berikutnya dalam antrian dijadwalkan untuk dijalankan dan kunci tetap terkunci. Jika tidak ada, tidak ada tugas yang menunggu dan kunci menjadi tidak terkunci.

Koneksi stream TCP

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

Buka koneksi TCP ke host dan port yang diberikan. Alamat host akan diselesaikan menggunakan socket.getaddrinfo(), yang saat ini merupakan panggilan pemblokiran. Jika ssl adalah objek ssl.SSLContext, konteks ini digunakan untuk membuat transport; jika ssl adalah True, konteks default digunakan.

Mengembalikan sepasang stream: stream pembaca dan penulis. Akan memunculkan OSError khusus socket jika host tidak dapat diselesaikan atau jika koneksi tidak dapat dibuat.

Ini adalah coroutine.

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

Mulai server TCP pada host dan port yang diberikan. callback akan dipanggil dengan koneksi masuk yang diterima, dan diteruskan 2 argumen: stream pembaca dan penulis untuk koneksi tersebut.

Jika ssl adalah objek ssl.SSLContext, konteks ini digunakan untuk membuat transport.

Mengembalikan objek Server.

Ini adalah coroutine.

class asyncio.Stream

Ini mewakili koneksi stream TCP. Untuk meminimalkan kode, kelas ini mengimplementasikan pembaca dan penulis, dan StreamReader serta StreamWriter adalah alias untuk kelas ini.

get_extra_info(v: str) Any

Dapatkan informasi tambahan tentang stream, yang diberikan oleh v. Nilai valid untuk v adalah: peername.

close() None

Tutup stream.

wait_closed() None

Tunggu hingga stream tertutup.

Ini adalah coroutine.

read(n: int = -1) bytes

Baca hingga n byte dan kembalikan. Jika n tidak disediakan atau -1 maka baca semua byte hingga EOF. Nilai yang dikembalikan akan menjadi objek bytes kosong jika EOF ditemui sebelum byte apa pun dibaca.

Ini adalah coroutine.

readinto(buf: bytearray | memoryview) int

Baca hingga n byte ke dalam buf dengan n sama dengan panjang buf.

Kembalikan jumlah byte yang dibaca ke dalam buf.

Ini adalah coroutine, dan merupakan ekstensi MicroPython.

readexactly(n: int) bytes

Baca tepat n byte dan kembalikan sebagai objek bytes.

Memunculkan pengecualian EOFError jika stream berakhir sebelum membaca n byte.

Ini adalah coroutine.

readline() bytes

Baca satu baris dan kembalikan.

Ini adalah coroutine.

write(buf: bytes) None

Akumulasikan buf ke buffer keluaran. Data hanya di-flush ketika Stream.drain() dipanggil. Disarankan untuk memanggil Stream.drain() segera setelah memanggil fungsi ini.

drain() None

Drain (tulis) semua data keluaran yang ter-buffer ke stream.

Ini adalah coroutine.

class asyncio.Server

Ini mewakili kelas server yang dikembalikan dari start_server(). Dapat digunakan dalam pernyataan async with untuk menutup server saat keluar.

close() None

Tutup server.

wait_closed() None

Tunggu hingga server tertutup.

Ini adalah coroutine.

Event Loop

asyncio.get_event_loop() Loop

Kembalikan event loop yang digunakan untuk menjadwalkan dan menjalankan tugas. Lihat Loop.

asyncio.new_event_loop() Loop

Reset event loop dan kembalikan.

Catatan: karena MicroPython hanya memiliki satu event loop, fungsi ini hanya mereset keadaan loop, bukan membuat yang baru.

class asyncio.Loop

Ini mewakili objek yang menjadwalkan dan menjalankan tugas. Tidak dapat dibuat, gunakan get_event_loop() sebagai gantinya.

create_task(coro: Coroutine) Task

Buat tugas dari coro yang diberikan dan kembalikan objek Task baru.

run_forever() None

Jalankan event loop hingga stop() dipanggil.

run_until_complete(awaitable: Awaitable) Any

Jalankan awaitable yang diberikan hingga selesai. Jika awaitable bukan tugas maka akan dipromosikan menjadi tugas.

stop() None

Hentikan event loop.

close() None

Tutup event loop.

set_exception_handler(handler: Callable) None

Atur penangan pengecualian yang dipanggil ketika sebuah Task memunculkan pengecualian yang tidak tertangkap. handler harus menerima dua argumen: (loop, context).

get_exception_handler() Callable | None

Dapatkan penangan pengecualian saat ini. Mengembalikan penangan, atau None jika tidak ada penangan kustom yang diatur.

default_exception_handler(context: dict) None

Penangan pengecualian default yang dipanggil.

call_exception_handler(context: dict) None

Panggil penangan pengecualian saat ini. Argumen context diteruskan dan merupakan kamus yang berisi kunci: 'message', 'exception', 'future'.