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
Noneise çağrı süresiz olarak bloke eder;0hemen 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
pollnesnesinden daha az verimlidir (her çağrıda dahili yoklama kümesini yeniden oluşturur); mümkün olduğunda bunun yerinepollkullanın.
Sabitler¶
- 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ümesimodify()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çinpoll(), veya bellek tahsisi gerektirmeyen yineleyici tabanlı bir varyant içinipoll()ç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:
select.POLLIN– okunabilecek veri mevcutselect.POLLOUT– akış, yazılmak üzere daha fazla veri kabul edebilir
eventmask varsayılan olarak
select.POLLIN | select.POLLOUTdeğerini alır.select.POLLHUPveselect.POLLERR, bir giriş eventmask içinde geçerli değildir – bunlar, istenip istenmediğine bakılmaksızınpoll()/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.ENOENTileOSErroroluş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
-1ise çağrı süresiz olarak bloke eder;0hemen 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.objkayıtlı akıştır veevent, gerçekleşenselect.POLLIN/select.POLLOUT/select.POLLERR/select.POLLHUPbayrakları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.POLLHUPveselect.POLLERRherhangi 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. flags1ise, 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öylecemodify()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.