asyncio — asenkron G/Ç zamanlayıcısı

Bu modül, async/await eşyordamları (coroutine) için iş birlikçi çoklu görev (cooperative-multitasking) zamanlayıcısının yanı sıra senkronizasyon için ilkeler (kilitler, olaylar) ve akış okuyucuları (stream reader) ile yazıcıları aracılığıyla engellemeyen TCP ağ iletişimi sağlar. Görevler tek bir olay döngüsünde eşzamanlı olarak çalıştırılır; o anda çalışan görev await ile denetimi döngüye geri verir.

Örnek:

import asyncio

async def blink(led, period_ms):
    while True:
        led.on()
        await asyncio.sleep_ms(5)
        led.off()
        await asyncio.sleep_ms(period_ms)

async def main(led1, led2):
    asyncio.create_task(blink(led1, 700))
    asyncio.create_task(blink(led2, 400))
    await asyncio.sleep_ms(10_000)

# Running on an OpenMV Cam
from machine import LED
asyncio.run(main(LED(1), LED(2)))

Çekirdek fonksiyonlar

asyncio.create_task(coro: Coroutine) Task

Verilen eşyordamdan yeni bir görev oluşturur ve çalışması için zamanlar.

İlgili Task nesnesini döndürür.

asyncio.current_task() Task

O anda çalışan görevle ilişkili Task nesnesini döndürür.

asyncio.run(coro: Coroutine) Any

Verilen eşyordamdan yeni bir görev oluşturur ve tamamlanana kadar çalıştırır.

coro tarafından döndürülen değeri döndürür.

asyncio.sleep(t: float) None

t saniye uyur (bir float olabilir).

Bu bir eşyordamdır.

asyncio.sleep_ms(t: int) None

t milisaniye uyur.

Bu bir eşyordam ve bir MicroPython uzantısıdır.

Ek fonksiyonlar

asyncio.wait_for(awaitable: Awaitable, timeout: float) Any

awaitable nesnesinin tamamlanmasını bekler, ancak timeout saniyeden uzun sürerse onu iptal eder. awaitable bir görev değilse, ondan bir görev oluşturulur.

Bir zaman aşımı oluşursa, görevi iptal eder ve asyncio.TimeoutError hatasını yükseltir: bunun çağıran tarafından yakalanması gerekir. Görev, yok sayılabilen veya temizleme kodunu çalıştırmak için try...except ya da try...finally ile yakalanabilen asyncio.CancelledError alır.

awaitable nesnesinin dönüş değerini döndürür.

Bu bir eşyordamdır.

asyncio.wait_for_ms(awaitable: Awaitable, timeout: int) Any

wait_for() ile benzerdir, ancak timeout milisaniye cinsinden bir tam sayıdır.

Bu bir eşyordam ve bir MicroPython uzantısıdır.

asyncio.gather(*awaitables, return_exceptions: bool = False) List

Tüm awaitables nesnelerini eşzamanlı olarak çalıştırır. Görev olmayan her awaitables, görev haline getirilir.

Tüm awaitables nesnelerinin dönüş değerlerinin bir listesini döndürür.

Bu bir eşyordamdır.

class Task

class asyncio.Task

Bu nesne, bir eşyordamı çalışan bir göreve sarmalar. Görevler await task kullanılarak beklenebilir; bu, görevin tamamlanmasını bekler ve görevin dönüş değerini döndürür.

Görevler doğrudan oluşturulmamalı, bunun yerine onları oluşturmak için create_task() kullanılmalıdır.

cancel() None

Görevin içine asyncio.CancelledError enjekte ederek görevi iptal eder. Görev bu istisnayı yok sayabilir. Temizleme kodu, bunu yakalayarak veya try ... finally aracılığıyla çalıştırılabilir.

class Event

class asyncio.Event

Görevleri senkronize etmek için kullanılabilen yeni bir olay oluşturur. Olaylar temizlenmiş durumda başlar.

is_set() bool

Olay ayarlanmışsa True, aksi takdirde False döndürür.

set() None

Olayı ayarlar. Olayı bekleyen tüm görevler çalışmak üzere zamanlanır.

Not: Bu, bir görevin içinden çağrılmalıdır. Bunu bir IRQ’dan, zamanlayıcı geri çağırmasından (callback) veya başka bir iş parçacığından çağırmak güvenli değildir. ThreadSafeFlag sınıfına bakın.

clear() None

Olayı temizler.

wait() None

Olayın ayarlanmasını bekler. Olay zaten ayarlanmışsa hemen geri döner.

Bu bir eşyordamdır.

class ThreadSafeFlag

class asyncio.ThreadSafeFlag

Bir görevi, diğer iş parçacıkları, IRQ’lar veya zamanlayıcı geri çağırmaları (callback) gibi asyncio döngüsünün dışında çalışan kodla senkronize etmek için kullanılabilen yeni bir bayrak (flag) oluşturur. Bayraklar temizlenmiş durumda başlar.

set() None

Bayrağı ayarlar. Bayrağı bekleyen bir görev varsa, çalışmak üzere zamanlanır.

clear() None

Bayrağı temizler. Bu, daha önce ayarlanmış olabilecek bir bayrağın, beklemeye geçmeden önce temizlenmiş olduğundan emin olmak için kullanılabilir.

wait() None

Bayrağın ayarlanmasını bekler. Bayrak zaten ayarlanmışsa hemen geri döner. Bayrak, wait çağrısından dönüldüğünde otomatik olarak sıfırlanır.

Bir bayrak aynı anda yalnızca tek bir görev tarafından beklenebilir.

Bu bir eşyordamdır.

class Lock

class asyncio.Lock

Görevleri koordine etmek için kullanılabilen yeni bir kilit oluşturur. Kilitler kilitlenmemiş durumda başlar.

Aşağıdaki yöntemlere ek olarak, kilitler bir async with ifadesinde kullanılabilir.

locked() bool

Kilit kilitliyse True, aksi takdirde False döndürür.

acquire() bool

Kilidin kilitlenmemiş duruma gelmesini bekler ve ardından onu atomik bir şekilde kilitler. Herhangi bir anda yalnızca tek bir görev kilidi edinebilir.

Bu bir eşyordamdır.

release() None

Kilidi serbest bırakır. Kilidi bekleyen görevler varsa, kuyruktaki bir sonraki görev çalışmak üzere zamanlanır ve kilit kilitli kalır. Aksi takdirde, hiçbir görev beklemiyordur ve kilit kilitlenmemiş duruma geçer.

TCP akış bağlantıları

asyncio.open_connection(host: str, port: int, ssl: ssl.SSLContext | bool | None = None) Tuple[Stream, Stream]

Verilen host ve port için bir TCP bağlantısı açar. host adresi, şu anda engelleyen bir çağrı olan socket.getaddrinfo() kullanılarak çözümlenir. ssl bir ssl.SSLContext nesnesiyse, taşıma katmanını oluşturmak için bu bağlam kullanılır; ssl True ise, varsayılan bir bağlam kullanılır.

Bir çift akış döndürür: bir okuyucu ve bir yazıcı akışı. Ana bilgisayar çözümlenemezse veya bağlantı kurulamazsa, sokete özgü bir OSError yükseltir.

Bu bir eşyordamdır.

asyncio.start_server(callback: Callable, host: str, port: int, backlog: int = 5, ssl: ssl.SSLContext | None = None) Server

Verilen host ve port üzerinde bir TCP sunucusu başlatır. callback, gelen, kabul edilmiş bağlantılarla çağrılır ve 2 argüman geçirilir: bağlantı için okuyucu ve yazıcı akışları.

ssl bir ssl.SSLContext nesnesiyse, taşıma katmanını oluşturmak için bu bağlam kullanılır.

Bir Server nesnesi döndürür.

Bu bir eşyordamdır.

class asyncio.Stream

Bu, bir TCP akış bağlantısını temsil eder. Kodu en aza indirmek için bu sınıf hem bir okuyucu hem de bir yazıcı uygular ve hem StreamReader hem de StreamWriter, bu sınıfa takma ad (alias) olarak işaret eder.

get_extra_info(v: str) Any

v tarafından verilen, akış hakkında ek bilgi alır. v için geçerli değerler şunlardır: peername.

close() None

Akışı kapatır.

wait_closed() None

Akışın kapanmasını bekler.

Bu bir eşyordamdır.

read(n: int = -1) bytes

En fazla n bayt okur ve döndürür. n sağlanmazsa veya -1 ise, EOF’a kadar tüm baytları okur. Herhangi bir bayt okunmadan önce EOF ile karşılaşılırsa, döndürülen değer boş bir bytes nesnesi olur.

Bu bir eşyordamdır.

readinto(buf: bytearray | memoryview) int

buf uzunluğuna eşit olan n bayta kadar buf içine okur.

buf içine okunan bayt sayısını döndürür.

Bu bir eşyordam ve bir MicroPython uzantısıdır.

readexactly(n: int) bytes

Tam olarak n bayt okur ve bunları bir bytes nesnesi olarak döndürür.

Akış, n bayt okunmadan önce sona ererse bir EOFError istisnası yükseltir.

Bu bir eşyordamdır.

readline() bytes

Bir satır okur ve döndürür.

Bu bir eşyordamdır.

write(buf: bytes) None

buf nesnesini çıktı arabelleğinde biriktirir. Veriler yalnızca Stream.drain() çağrıldığında boşaltılır. Bu fonksiyonu çağırdıktan hemen sonra Stream.drain() çağırmanız önerilir.

drain() None

Arabelleğe alınmış tüm çıktı verilerini akışa boşaltır (yazar).

Bu bir eşyordamdır.

class asyncio.Server

Bu, start_server() tarafından döndürülen sunucu sınıfını temsil eder. Çıkışta sunucuyu kapatmak için bir async with ifadesinde kullanılabilir.

close() None

Sunucuyu kapatır.

wait_closed() None

Sunucunun kapanmasını bekler.

Bu bir eşyordamdır.

Olay Döngüsü

asyncio.get_event_loop() Loop

Görevleri zamanlamak ve çalıştırmak için kullanılan olay döngüsünü döndürür. Loop sınıfına bakın.

asyncio.new_event_loop() Loop

Olay döngüsünü sıfırlar ve döndürür.

Not: MicroPython yalnızca tek bir olay döngüsüne sahip olduğundan, bu fonksiyon yalnızca döngünün durumunu sıfırlar, yeni bir döngü oluşturmaz.

class asyncio.Loop

Bu, görevleri zamanlayan ve çalıştıran nesneyi temsil eder. Oluşturulamaz, bunun yerine get_event_loop() kullanın.

create_task(coro: Coroutine) Task

Verilen coro nesnesinden bir görev oluşturur ve yeni Task nesnesini döndürür.

run_forever() None

stop() çağrılana kadar olay döngüsünü çalıştırır.

run_until_complete(awaitable: Awaitable) Any

Verilen awaitable nesnesini tamamlanana kadar çalıştırır. awaitable bir görev değilse, bir göreve dönüştürülür.

stop() None

Olay döngüsünü durdurur.

close() None

Olay döngüsünü kapatır.

set_exception_handler(handler: Callable) None

Bir Task’in yakalanmayan bir istisna yükselttiğinde çağrılacak istisna işleyicisini ayarlar. handler iki argüman kabul etmelidir: (loop, context).

get_exception_handler() Callable | None

Geçerli istisna işleyicisini alır. İşleyiciyi veya özel bir işleyici ayarlanmamışsa None döndürür.

default_exception_handler(context: dict) None

Çağrılan varsayılan istisna işleyicisi.

call_exception_handler(context: dict) None

Geçerli istisna işleyicisini çağırır. context argümanı olduğu gibi geçirilir ve şu anahtarları içeren bir sözlüktür: 'message', 'exception', 'future'.