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; 0 mengembalikan 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); gunakan poll sebagai gantinya jika memungkinkan.

Konstanta

select.POLLIN: int

Ada data yang tersedia untuk dibaca dari stream.

select.POLLOUT: int

Stream dapat menerima lebih banyak data untuk ditulis.

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 dengan unregister(), dan kumpulan event yang dipantau dapat diubah dengan modify(). Setelah dikonfigurasi, panggil poll() untuk memblokir hingga ada yang siap (atau timeout berakhir), atau ipoll() 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):

eventmask defaultnya adalah select.POLLIN | select.POLLOUT.

select.POLLHUP dan select.POLLERR tidak valid dalam eventmask input -- keduanya merupakan event yang tidak diminta yang dilaporkan oleh poll() / 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 OSError dengan errno.ENOENT jika 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; 0 mengembalikan segera (polling non-blocking).

Mengembalikan daftar tuple (obj, event, ...), satu per stream yang terpicu. obj adalah stream yang terdaftar dan event adalah OR bitwise dari flag select.POLLIN / select.POLLOUT / select.POLLERR / select.POLLHUP yang 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.POLLHUP dan select.POLLERR dapat 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 adalah 1, perilaku one-shot digunakan: stream yang eventnya terpicu akan memiliki event mask-nya dibersihkan secara otomatis (setara dengan poll.modify(obj, 0)), sehingga tidak ada event lebih lanjut yang dilaporkan untuknya hingga mask-nya diset ulang dengan modify().

Callback terjadwal yang tertunda dijamin akan dijalankan sebelum loop polling dimulai.

Perbedaan dengan CPython

Metode ini adalah ekstensi MicroPython.