select --- menunggu event pada sekumpulan stream¶
Modul ini menyediakan fungsi untuk menunggu secara efisien hingga satu atau lebih stream (objek seperti file yang mengimplementasikan protokol stream, seperti socket, UART, dan objek I/O lainnya) siap untuk dibaca atau ditulis, alih-alih busy-waiting atau memblokir pada satu objek.
Objek poll adalah antarmuka yang direkomendasikan: ia dapat menskalakan ke banyak stream dan bebas alokasi saat digunakan melalui poll.ipoll(). Fungsi select() tingkat modul adalah antarmuka kompatibilitas yang kurang efisien.
Contoh menggunakan objek poll
import select
poller = select.poll()
poller.register(uart, select.POLLIN)
while True:
# Wait up to 1000 ms for the UART to have data.
for obj, event in poller.poll(1000):
if event & select.POLLIN:
print(obj.read())
Contoh menggunakan fungsi select() tingkat modul:
import select
# Wait up to 1 second for the socket to become readable.
rlist, wlist, xlist = select.select([sock], [], [], 1.0)
if rlist:
data = sock.recv(100)
Fungsi¶
- select.select(rlist: List, wlist: List, xlist: List, timeout: float | None = None) Tuple[List, List, List]¶
Tunggu hingga satu atau lebih objek stream yang diberikan siap, atau hingga timeout berakhir.
rlist adalah daftar objek untuk dipantau keterbacaannya.
wlist adalah daftar objek untuk dipantau ketulisannya.
xlist adalah daftar objek untuk dipantau kondisi error atau hang-up.
timeout adalah waktu tunggu maksimum, dalam detik (float diterima). Jika dihilangkan atau
None, panggilan memblokir tanpa batas;0mengembalikan segera (polling non-blocking).
Mengembalikan tuple 3-elemen berupa daftar
(rlist, wlist, xlist). Setiap daftar yang dikembalikan adalah bagian dari daftar input yang sesuai yang berisi objek yang siap dibaca, siap ditulis, atau yang memberi sinyal error/hang-up. Jika timeout habis tanpa ada yang siap, ketiga daftar kosong.Fungsi ini kurang efisien daripada
poll(ia membangun ulang set poll internalnya pada setiap panggilan); gunakanpollsebagai gantinya jika memungkinkan.
Konstanta¶
- select.POLLERR: int¶
Kondisi error terjadi pada stream. Ini adalah event yang tidak diminta: dilaporkan oleh
poll.poll()/poll.ipoll()meskipun tidak diminta dalam eventmask, dan tidak valid untuk melewatkannya sebagai eventmask input.
- select.POLLHUP: int¶
Stream terputus / terlepas. Ini adalah event yang tidak diminta: dilaporkan oleh
poll.poll()/poll.ipoll()meskipun tidak diminta dalam eventmask, dan tidak valid untuk melewatkannya sebagai eventmask input.
Kelas¶
- class select.poll¶
Buat objek polling yang mempertahankan sekumpulan stream yang terdaftar (atau objek apa pun yang mengekspos protokol stream) dan menunggu secara efisien hingga satu atau lebih menjadi dapat dibaca, dapat ditulis, atau memberi sinyal kondisi luar biasa.
Stream ditambahkan dengan
register(), dihapus denganunregister(), dan kumpulan event yang dipantau dapat diubah denganmodify(). Setelah dikonfigurasi, panggilpoll()untuk memblokir hingga ada yang siap (atau timeout berakhir), atauipoll()untuk varian berbasis iterator yang bebas alokasi.- register(obj: Any, eventmask: int = select.POLLIN | select.POLLOUT) None¶
Daftarkan stream obj untuk polling, memantau event yang diberikan oleh eventmask (OR logis dari):
select.POLLIN-- data tersedia untuk dibacaselect.POLLOUT-- stream dapat menerima lebih banyak data untuk ditulis
eventmask defaultnya adalah
select.POLLIN | select.POLLOUT.select.POLLHUPdanselect.POLLERRtidak valid dalam eventmask input -- keduanya merupakan event yang tidak diminta yang dilaporkan olehpoll()/ipoll()terlepas dari apakah diminta (ini sesuai dengan semantik POSIX).Tidak masalah untuk memanggil metode ini lebih dari sekali untuk obj yang sama: panggilan berikutnya memperbarui event mask obj, berperilaku seperti
modify().
- unregister(obj: Any) None¶
Hapus obj dari kumpulan stream yang terdaftar. Tidak ada error saat menghapus registrasi obj yang saat ini tidak terdaftar (panggilan tidak memiliki efek dalam kasus tersebut).
- modify(obj: Any, eventmask: int) None¶
Ubah event mask untuk obj yang sudah terdaftar menjadi eventmask. Memunculkan
OSErrordenganerrno.ENOENTjika obj tidak terdaftar.
- poll(timeout: int = -1, /) List[Tuple]¶
Blokir hingga setidaknya satu stream yang terdaftar menjadi siap atau memberi sinyal kondisi luar biasa, lalu kembalikan daftar stream yang terpicu.
timeout adalah waktu tunggu maksimum dalam milidetik. Jika dihilangkan atau
-1, panggilan memblokir tanpa batas;0mengembalikan segera (polling non-blocking).Mengembalikan daftar tuple
(obj, event, ...), satu per stream yang terpicu.objadalah stream yang terdaftar daneventadalah OR bitwise dari flagselect.POLLIN/select.POLLOUT/select.POLLERR/select.POLLHUPyang terjadi. Setiap tuple mungkin berisi elemen tambahan yang ditentukan implementasi, jadi jangan asumsikan panjang tepat 2. Jika timeout habis tanpa ada yang siap, daftar kosong dikembalikan.select.POLLHUPdanselect.POLLERRdapat dikembalikan kapan saja (bahkan jika tidak diminta) dan harus ditangani -- biasanya dengan membatalkan registrasi dan menutup stream yang terpengaruh -- jika tidak, panggilan berikutnya akan terus segera mengembalikan flag ini yang diset untuk stream tersebut.Callback terjadwal yang tertunda dijamin akan dijalankan sebelum loop polling dimulai.
Perbedaan dengan CPython
Tuple yang dikembalikan mungkin mengandung lebih dari 2 elemen, seperti dijelaskan di atas.
- ipoll(timeout: int = -1, flags: int = 0, /) Iterator[Tuple]¶
Seperti
poll(), tetapi alih-alih membuat daftar, fungsi ini mengembalikan iterator yang menghasilkan satu tuple(obj, event, ...)pada satu waktu. Ini menghindari alokasi pada setiap panggilan, yang penting untuk penjadwal I/O asinkron.Tuple yang dihasilkan adalah milik callee: digunakan kembali (ditimpa) pada iterasi berikutnya, sehingga isinya harus dikonsumsi dalam badan loop dan referensi ke dalamnya tidak boleh disimpan.
timeout memiliki arti yang sama seperti untuk
poll(). Jika flags adalah1, perilaku one-shot digunakan: stream yang eventnya terpicu akan memiliki event mask-nya dibersihkan secara otomatis (setara denganpoll.modify(obj, 0)), sehingga tidak ada event lebih lanjut yang dilaporkan untuknya hingga mask-nya diset ulang denganmodify().Callback terjadwal yang tertunda dijamin akan dijalankan sebelum loop polling dimulai.
Perbedaan dengan CPython
Metode ini adalah ekstensi MicroPython.