select — bir akış kümesindeki olayları bekleme

Bu modül, tek bir nesne üzerinde meşgul bekleme (busy-waiting) veya bloke etme yerine, bir veya daha fazla akışın (soketler, UART’lar ve diğer G/Ç nesneleri gibi akış protokolünü uygulayan dosya benzeri nesneler) okuma veya yazma için hazır olmasını verimli bir şekilde beklemek için fonksiyonlar sağlar.

poll nesnesi önerilen arayüzdür: birçok akışa ölçeklenir ve poll.ipoll() aracılığıyla kullanıldığında bellek tahsisi gerektirmez. Modül düzeyindeki select() fonksiyonu daha az verimli bir uyumluluk arayüzüdür.

Bir poll nesnesi kullanan örnek:

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

Modül düzeyindeki select() fonksiyonunu kullanan örnek:

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)

Fonksiyonlar

select.select(rlist: List, wlist: List, xlist: List, timeout: float | None = None) Tuple[List, List, List]

Verilen akış nesnelerinden bir veya daha fazlası hazır olana ya da timeout süresi dolana kadar bekler.

  • rlist, okunabilirlik açısından izlenecek nesnelerin listesidir.

  • wlist, yazılabilirlik açısından izlenecek nesnelerin listesidir.

  • xlist, bir hata veya kopma (hang-up) durumu açısından izlenecek nesnelerin listesidir.

  • timeout, saniye cinsinden beklenecek maksimum süredir (bir float kabul edilir). Atlanırsa veya None ise çağrı süresiz olarak bloke eder; 0 hemen döner (bloke etmeyen bir yoklama).

Listelerden oluşan bir 3’lü tuple döndürür: (rlist, wlist, xlist). Döndürülen her liste, sırasıyla okuma için hazır hale gelen, yazma için hazır hale gelen veya bir hata/kopma (hang-up) bildiren nesneleri içeren karşılık gelen giriş listesinin alt kümesidir. timeout hiçbir şey hazır olmadan dolarsa, üç listenin de tümü boş olur.

Bu fonksiyon poll nesnesinden daha az verimlidir (her çağrıda dahili yoklama kümesini yeniden oluşturur); mümkün olduğunda bunun yerine poll kullanın.

Sabitler

select.POLLIN: int

Akıştan okunabilecek veri mevcut.

select.POLLOUT: int

Akış, yazılmak üzere daha fazla veri kabul edebilir.

select.POLLERR: int

Akışta bir hata durumu oluştu. Bu istenmeyen (unsolicited) bir olaydır: eventmask içinde istenmemiş olsa bile poll.poll() / poll.ipoll() tarafından raporlanır ve bir giriş eventmask olarak geçirilmesi geçerli değildir.

select.POLLHUP: int

Akış kapatıldı / bağlantısı kesildi. Bu istenmeyen (unsolicited) bir olaydır: eventmask içinde istenmemiş olsa bile poll.poll() / poll.ipoll() tarafından raporlanır ve bir giriş eventmask olarak geçirilmesi geçerli değildir.

Sınıflar

class select.poll

Kayıtlı akışlardan (veya akış protokolünü sunan herhangi bir nesneden) oluşan bir küme tutan ve bunlardan biri veya daha fazlası okunabilir, yazılabilir hale gelene ya da olağan dışı bir durum bildirene kadar verimli bir şekilde bekleyen bir yoklama (polling) nesnesi oluşturur.

Akışlar register() ile eklenir, unregister() ile kaldırılır ve izlenecek olay kümesi modify() ile değiştirilebilir. Yapılandırıldıktan sonra, bir şey hazır olana (ya da bir zaman aşımı dolana) kadar bloke etmek için poll(), veya bellek tahsisi gerektirmeyen yineleyici tabanlı bir varyant için ipoll() çağırın.

register(obj: Any, eventmask: int = select.POLLIN | select.POLLOUT) None

akış obj nesnesini yoklama için kaydeder ve eventmask (aşağıdakilerin mantıksal VEYA’sı) tarafından verilen olayları izler:

eventmask varsayılan olarak select.POLLIN | select.POLLOUT değerini alır.

select.POLLHUP ve select.POLLERR, bir giriş eventmask içinde geçerli değildir – bunlar, istenip istenmediğine bakılmaksızın poll() / ipoll() tarafından raporlanan istenmeyen olaylardır (bu, POSIX semantiğiyle eşleşir).

Bu metodu aynı obj için birden fazla kez çağırmak sorun değildir: sonraki bir çağrı, obj nesnesinin olay maskesini günceller ve modify() gibi davranır.

unregister(obj: Any) None

obj nesnesini kayıtlı akışlar kümesinden kaldırır. Halihazırda kayıtlı olmayan bir obj nesnesinin kaydını kaldırmak bir hata değildir (bu durumda çağrının bir etkisi olmaz).

modify(obj: Any, eventmask: int) None

Halihazırda kayıtlı olan bir obj nesnesinin olay maskesini eventmask olarak değiştirir. obj kayıtlı değilse errno.ENOENT ile OSError oluşturur.

poll(timeout: int = -1, /) List[Tuple]

En az bir kayıtlı akış hazır hale gelene veya olağan dışı bir durum bildirene kadar bloke eder, ardından tetiklenen akışların listesini döndürür.

timeout, milisaniye cinsinden beklenecek maksimum süredir. Atlanırsa veya -1 ise çağrı süresiz olarak bloke eder; 0 hemen döner (bloke etmeyen bir yoklama).

Tetiklenen her akış için bir tane olmak üzere (obj, event, ...) tuple’larından oluşan bir liste döndürür. obj kayıtlı akıştır ve event, gerçekleşen select.POLLIN / select.POLLOUT / select.POLLERR / select.POLLHUP bayraklarının bit düzeyinde VEYA’sıdır. Her tuple, uygulamaya özgü ek öğeler içerebilir, bu nedenle uzunluğunun tam olarak 2 olduğunu varsaymayın. timeout hiçbir şey hazır olmadan dolarsa, boş bir liste döndürülür.

select.POLLHUP ve select.POLLERR herhangi bir zamanda (istenmemiş olsa bile) döndürülebilir ve bunlara göre işlem yapılmalıdır – genellikle etkilenen akışın kaydını kaldırarak ve kapatarak – aksi takdirde sonraki çağrılar, bu akış için bu bayraklar ayarlanmış halde hemen dönmeye devam eder.

Yoklama döngüsüne girilmeden önce, bekleyen zamanlanmış geri çağırmaların (callback) çalışacağı garanti edilir.

CPython’dan Fark

Döndürülen tuple’lar, yukarıda açıklandığı gibi 2’den fazla öğe içerebilir.

ipoll(timeout: int = -1, flags: int = 0, /) Iterator[Tuple]

poll() gibidir, ancak bir liste oluşturmak yerine her seferinde bir (obj, event, ...) tuple’ı veren bir yineleyici döndürür. Bu, her çağrıda bellek tahsisinden kaçınır; bu da asenkron G/Ç zamanlayıcıları için önemlidir.

Verilen (yield edilen) tuple çağrılan tarafından sahiplenilir (callee-owned): sonraki yinelemede yeniden kullanılır (üzerine yazılır), bu nedenle içeriği döngü gövdesi içinde tüketilmeli ve ona yapılan referanslar saklanmamalıdır.

timeout, poll() için olduğuyla aynı anlama gelir. flags 1 ise, tek seferlik (one-shot) davranış kullanılır: olayı tetiklenen bir akışın olay maskesi otomatik olarak temizlenir (poll.modify(obj, 0) ile eşdeğer), böylece modify() ile maskesi yeniden ayarlanana kadar onun için başka olay raporlanmaz.

Yoklama döngüsüne girilmeden önce, bekleyen zamanlanmış geri çağırmaların (callback) çalışacağı garanti edilir.

CPython’dan Fark

Bu metot bir MicroPython uzantısıdır.