4. Реактивні розширення для Python
RxPY – бібліотека для створення і маніпуляцій
асинхронними потоками даних
Є портом Reactive Extensions для .NET
Працює під Python 2.7, 3.4, PyPy і IronPython
З коробки взаємодіє з AsyncIO, Tornado, GEvent,
Twisted, Tkinter, PyGame а також PyQt4 i PyQt5
https://github.com/ReactiveX/RxPY/
pip install rx
4
20. observe_on
20
import threading
from rx.concurrency import NewThreadScheduler, CurrentThreadScheduler
from rx.observable import Observable
def map_n(n):
print("Mapping %d in thread %d" %
(n, threading.current_thread().ident))
return n + 1
def observe(n):
print("Got result %d in thread %d" %
(n, threading.current_thread().ident))
scheduler = NewThreadScheduler()
obs = Observable.from_iterable([1, 10])
.map(map_n)
.observe_on(scheduler)
.map(map_n)
i = obs.to_blocking().to_iterable()
[observe(x) for x in i]
21. Вийде щось таке
21
Mapping 1 in thread 9832
Mapping 10 in thread 9832
Mapping 2 in thread 2424
Mapping 11 in thread 2424
Got result 3 in thread 9832
Got result 12 in thread 9832
22. Уникайте Rx заради Rx
22
# Find packets with TCP, a dport of 80, and
# a length between 50-65
http = sub.select(lambda x:x
).where(lambda x: TCP in x
).where(lambda x: x[IP].dport == 80
).where(lambda x: int(x[IP].len) < 65
).where(lambda x: int(x[IP].len) > 50)
# знайдено в github
23. Тільки чисті функції
23
1. По замовчуванню круто
2. На перед не відомо в якому треді (корутині, процесі,
…) буде запускатись ф-я
3. Є метод do_action, якщо зовсім не терпиться
24. Побічні дії за межі RX
24
потрібна модель – зробіть її зовнішньою
потрібен стан – зробіть його Observable або винесіть
за RX
потрібна бібліотека з внутрішнім станом – винесіть її
за RX, зробивши адаптер з ІО для неї
27. Недоліки
27
Не консистентне апі
Неймовірно болючий дебаг
Майже відсутня документація
Відсутні Гарячі і Холодні спостерігачі з коробки
Не до кінця продумана підтримка своїх
планувальників
Просто неймовірно болючий дебаг
Не всюди доступні методи класу як оператори
Відсутні підказки в IDE
Дебаг
29. Embrace the power!
29
Реактивний маніфест
Орієнтованість на події
Стійкість до відмови
Масштабованість
Чутливість
http://www.reactivemanifesto.org/