Dyspozytorzy w Pythonie z Asyncio

May 08 2023
Co to jest programowanie oparte na zdarzeniach?
Programowanie oparte na zdarzeniach to paradygmat programowania, w którym przebieg programu jest określany przez występujące zdarzenia, a nie przez sekwencję instrukcji wykonywanych w określonej kolejności. W programowaniu opartym na zdarzeniach program reaguje na zdarzenia w systemie lub środowisku, zamiast wykonywać z góry określony zestaw instrukcji.
Zdjęcie Hitesha Choudhary'ego na Unsplash

Programowanie oparte na zdarzeniach to paradygmat programowania, w którym przebieg programu jest określany przez występujące zdarzenia, a nie przez sekwencję instrukcji wykonywanych w określonej kolejności. W programowaniu opartym na zdarzeniach program reaguje na zdarzenia w systemie lub środowisku, zamiast wykonywać z góry określony zestaw instrukcji.

Zdarzenia mogą wyzwalać różne źródła, takie jak dane wprowadzane przez użytkownika, zdarzenia systemowe, aktywność sieciowa lub liczniki czasu. Kiedy wystąpi zdarzenie, program może na nie zareagować, wykonując jedną lub więcej funkcji lub wywołań zwrotnych zarejestrowanych do obsługi tego konkretnego zdarzenia. Dzięki temu program jest bardziej elastyczny i responsywny, ponieważ może reagować na zdarzenia w miarę ich pojawiania się, zamiast czekać na zakończenie określonej sekwencji działań.

Programowanie oparte na zdarzeniach jest powszechnie stosowane w graficznych interfejsach użytkownika (GUI), w których działania użytkownika, takie jak kliknięcia myszą lub wprowadzanie danych z klawiatury, są traktowane jako zdarzenia wyzwalające działania lub aktualizacje w programie. Jest również używany w tworzeniu stron internetowych, gdzie żądania HTTP lub zdarzenia przeglądarki wyzwalają wykonanie kodu po stronie serwera lub klienta. Architektury sterowane zdarzeniami stają się również coraz bardziej powszechne w systemach rozproszonych, w których komunikaty lub zdarzenia komunikują się między różnymi usługami lub komponentami.

Dyspozytor

W kontekście programowania opartego na zdarzeniach dyspozytor jest obiektem, który odbiera zdarzenia, a następnie wysyła je do odpowiednich procedur obsługi zdarzeń. Dyspozytor jest odpowiedzialny za zarządzanie rejestracją i wyrejestrowywaniem programów obsługi zdarzeń oraz zapewnienie, że zdarzenia są dostarczane do właściwych osób.

W niektórych platformach sterowanych zdarzeniami dyspozytor jest nazywany magistralą lub pętlą zdarzeń. Magistrala zdarzeń odbiera i wysyła zdarzenia z różnych źródeł do odpowiednich procedur obsługi zdarzeń. Pętla zdarzeń zarządza planowaniem i wykonywaniem współprogramów i wywołań zwrotnych w odpowiedzi na zdarzenia.

Dyspozytor może również wykonywać inne zadania, takie jak filtrowanie i przetwarzanie zdarzeń, zanim zostaną one wysłane do obsługi zdarzeń. Na przykład dyspozytor może zaimplementować wzorzec publikowania-subskrybowania, w którym zdarzenia są filtrowane i wysyłane tylko do tych programów obsługi zdarzeń, które zasubskrybowały ich otrzymywanie.

Utwórz dyspozytora w Pythonie za pomocą Asyncio

Aby utworzyć dyspozytora za pomocą asyncio w Pythonie, możesz użyć tej asyncio.Queueklasy do utworzenia kolejki, która może być używana do przekazywania wiadomości między współprogramami. Oto przykład prostej implementacji dyspozytora. Utwórz plik dispatcher.pyi wstaw następujący kod:

import asyncio

async def producer(queue):
    for i in range(10):
        await asyncio.sleep(1)
        await queue.put(i)
    await queue.put(None)

async def consumer(queue):
    while True:
        item = await queue.get()
        if item is None:
            break
        print(f"Consumed: {item}")
        queue.task_done()

async def main():
    queue = asyncio.Queue()
    tasks = [
        asyncio.create_task(producer(queue)),
        asyncio.create_task(consumer(queue)),
    ]
    await asyncio.gather(*tasks)
    await queue.join()

asyncio.run(main())

W maincoroutine tworzymy instancję asyncio.Queuei przekazujemy ją zarówno do produceri consumercoroutines. Następnie tworzymy zadania dla obu współprogramów za pomocą asyncio.create_task(), i przekazujemy je, asyncio.gather()aby uruchamiały je jednocześnie. Na koniec dzwonimy, queue.join()aby poczekać na zakończenie wszystkich zadań.

Uruchom plik z python3 dispatcher.py. Otrzymasz poniższe dane wyjściowe:

Kod tego artykułu jest dostępny tutaj na Github:

Wniosek

Dyspozytor generalnie odgrywa kluczową rolę w zarządzaniu zdarzeniami w systemie opartym na zdarzeniach. Zapewnia, że ​​zdarzenia są przetwarzane wydajnie i dokładnie, a procedury obsługi zdarzeń są poprawnie rejestrowane i wyrejestrowywane w razie potrzeby.

To wszystko w tym artykule! Zachęcamy do pozostawienia opinii lub pytań w komentarzach. Jeśli uważasz, że to ekscytująca lektura, zostaw kilka braw i obserwuj! Dzięki!