8.16. Penutup¶
Anda telah menelusuri API asyncio -- bagian-bagian yang dibutuhkan skrip untuk menjalankan beberapa pekerjaan secara bersamaan pada satu CPU:
Penjadwalan kooperatif -- model tempat seluruh modul ini bersandar. Coroutine yang berjalan memiliki loop untuk dirinya sendiri sampai ia
awaits; perpindahan hanya terjadi pada awaits tersebut.Coroutine dan task --
async defmendefinisikan unit kerja;asyncio.create_task()menjadwalkan satu secara bersamaan dan mengembalikanTaskyang nantinya dapat ditunggu, dibatalkan, atau diidentifikasi oleh aplikasi.Event loop -- mesin yang menjalankan coroutine dan task.
asyncio.run()adalah satu-satunya titik masuk yang dibutuhkan sebagian besar skrip; kelasLoopmengekspos sisanya untuk kasus langka yang memerlukannya.Koordinasi --
gather()untuk fan-out dan fan-in,wait_for()untuk deadline,Task.canceldan pola pembersihan klausafinally, propagasi eksepsi melalui task dan pemanggilan gather, serta hook handler eksepsi loop.Primitif sinkronisasi --
Eventuntuk sinyal antar coroutine,Lockuntuk menserialisasi akses ke sumber daya bersama di antara awaits, danThreadSafeFlaguntuk membangunkan task asyncio dari handler interupsi.Objek async kustom -- hook bahasa yang memungkinkan kelas aplikasi terhubung dengan idiom asyncio.
__await__untuk objek yang sendirinya adalah target dariawait,__aiter__/__anext__untukasync for, dan__aenter__/__aexit__untukasync with.Capture bingkai -- pembungkus yang mengubah
csi.CSI.snapshot()menjadi coroutine yang ramahawait, sehingga loop capture berjalan berdampingan dengan pekerjaan asyncio lainnya.Jebakan umum --
awaits yang terlupakan, loop ketat tanpa yield, pembatalan yang ditelan, state bersama yang diubah di antara awaits, dan jebakan spesifik asyncio lainnya.
Itu sudah cukup untuk menulis program yang menggabungkan pekerjaan kamera, I/O hardware, dan pekerjaan latar belakang bersamaan pada loop yang sama.
8.16.1. Menggunakan referensi ini nanti¶
Perlakukan bab-bab asyncio sebagai materi referensi; kembali untuk mencari pola async with atau perilaku tepat dari gather() pada kegagalan sibling adalah penggunaan yang dimaksud. Halaman referensi asyncio mencantumkan setiap fungsi dan kelas di satu tempat ketika pertanyaannya hanyalah "apa nama tepat dari pemanggilan ini".
Untuk primitif yang lebih kaya yang dibangun di atas modul ini -- semaphore, antrian, barrier, dan koleksi helper yang besar berbentuk aplikasi -- repositori peterhinch/micropython-async adalah sumber standar yang dikelola komunitas.
8.16.2. Ke mana selanjutnya¶
Jaringan adalah topik besar berikutnya. asyncio.open_connection(), asyncio.start_server(), dan kelas Stream adalah cara skrip asyncio berkomunikasi dengan jaringan dari dalam coroutine, bersama dengan modul network dan socket di bawahnya. Semua yang telah Anda pelajari tentang await, Task, pembatalan, dan primitif sinkronisasi berlaku langsung ke depan.