Programowanie reaktywne

Programowanie reaktywne to paradygmat programowania, który zajmuje się przepływem danych i propagacją zmian. Oznacza to, że gdy przepływ danych jest emitowany przez jeden komponent, zmiana będzie propagowana do innych komponentów przez reaktywną bibliotekę programowania. Propagacja zmiany będzie kontynuowana, aż dotrze do końcowego odbiorcy. Różnica między programowaniem sterowanym zdarzeniami a programowaniem reaktywnym polega na tym, że programowanie sterowane zdarzeniami obraca się wokół zdarzeń, a programowanie reaktywne obraca się wokół danych.

ReactiveX lub RX do programowania reaktywnego

ReactiveX lub Raective Extension to najbardziej znana implementacja programowania reaktywnego. Działanie ReactiveX zależy od następujących dwóch klas -

Obserwowalna klasa

Ta klasa jest źródłem strumienia danych lub zdarzeń i pakuje przychodzące dane, dzięki czemu dane mogą być przekazywane z jednego wątku do drugiego. Nie poda danych, dopóki jakiś obserwator go nie zapisze.

Klasa obserwatora

Ta klasa zużywa strumień danych wyemitowany przez observable. Może istnieć wielu obserwatorów z możliwością obserwacji, a każdy obserwator otrzyma każdy wyemitowany element danych. Obserwator może otrzymać trzy rodzaje zdarzeń, subskrybując obserwowalne -

  • on_next() event - Oznacza to, że strumień danych zawiera element.

  • on_completed() event - Oznacza to koniec emisji i żadne elementy nie nadchodzą.

  • on_error() event - Oznacza również koniec emisji, ale w przypadku zgłoszenia błędu observable.

RxPY - moduł Pythona do programowania reaktywnego

RxPY to moduł Pythona, który może być używany do programowania reaktywnego. Musimy upewnić się, że moduł jest zainstalowany. Do zainstalowania modułu RxPY można użyć następującego polecenia -

pip install RxPY

Przykład

Poniżej znajduje się skrypt w Pythonie, który używa RxPY moduł i jego klasy Observable i Observe forprogramowanie reaktywne. Zasadniczo istnieją dwie klasy -

  • get_strings() - za pobranie strun od obserwatora.

  • PrintObserver()- do drukowania napisów od obserwatora. Wykorzystuje wszystkie trzy zdarzenia klasy obserwatorów. Używa również klasy subscribe ().

from rx import Observable, Observer
def get_strings(observer):
   observer.on_next("Ram")
   observer.on_next("Mohan")
   observer.on_next("Shyam")
      observer.on_completed()
class PrintObserver(Observer):
   def on_next(self, value):
      print("Received {0}".format(value))
   def on_completed(self):
   print("Finished")
   def on_error(self, error):
      print("Error: {0}".format(error))
source = Observable.create(get_strings)
source.subscribe(PrintObserver())

Wynik

Received Ram
Received Mohan
Received Shyam
Finished

Biblioteka PyFunctional do programowania reaktywnego

PyFunctionalto kolejna biblioteka Pythona, której można użyć do programowania reaktywnego. Umożliwia nam tworzenie programów funkcjonalnych przy użyciu języka programowania Python. Jest to przydatne, ponieważ pozwala nam tworzyć potoki danych przy użyciu połączonych operatorów funkcjonalnych.

Różnica między RxPY i PyFunctional

Obie biblioteki są używane do programowania reaktywnego i obsługują strumień w podobny sposób, ale główna różnica między nimi zależy od obsługi danych. RxPY obsługuje dane i zdarzenia w systemie podczas PyFunctional koncentruje się na transformacji danych przy użyciu paradygmatów programowania funkcjonalnego.

Instalowanie modułu PyFunctional

Musimy zainstalować ten moduł przed jego użyciem. Można go zainstalować za pomocą polecenia pip w następujący sposób -

pip install pyfunctional

Przykład

Poniższy przykład używa the PyFunctional moduł i jego seqklasa, która działa jako obiekt strumienia, z którym możemy iterować i manipulować. W tym programie odwzorowuje sekwencję za pomocą funkcji lamda, która podwaja każdą wartość, a następnie filtruje wartość, w której x jest większe niż 4, i ostatecznie redukuje sekwencję do sumy wszystkich pozostałych wartości.

from functional import seq

result = seq(1,2,3).map(lambda x: x*2).filter(lambda x: x > 4).reduce(lambda x, y: x + y)

print ("Result: {}".format(result))

Wynik

Result: 6