Slide 1

Slide 1 text

Введение RPC PyRO . . PyRO: Python Remote Objects

Slide 2

Slide 2 text

. . Введение RPC PyRO О докладе PyRO - библиотека, реализующая RPC методов объектов Доклад в виде статьи доступен в блоге http://chtd.ru/blog/pyro . . . 2

Slide 3

Slide 3 text

. . Введение RPC PyRO PyRO: Python Remote Objects Введение RPC PyRO . . . 3

Slide 4

Slide 4 text

. . Введение RPC PyRO Зачем нужна параллельность? На практике возникают задачи, которые не решаются с помощью последовательного однопоточного программирования. Работа в фоне и асинхронность Распределенная работа . . . 4

Slide 5

Slide 5 text

. . Введение RPC PyRO Стандартная библиотека threading multiprocessing . . . 5

Slide 6

Slide 6 text

. . Введение RPC PyRO threading Содержит инструменты для работы с нитями. Достоинства: Общая память Недостатки: GIL Подробнее: Загадочный GIL (Андрей Светлов) . . . 6

Slide 7

Slide 7 text

. . Введение RPC PyRO multiprocessing Содержит инструменты для работы с процессами. Достоинства: Настоящая параллельность Недостатки Раздельная память . . . 7

Slide 8

Slide 8 text

. . Введение RPC PyRO Практическое использование threading Реализация: вызов функции в отдельной нити Минимальные изменения существующего кода multiprocessing Реализация: вызов функции в отдельном процессе Требуется организация взаимодействия процессов используя связывющие объекты: Connec on, Queue Требуются существенные правки в коде . . . 8

Slide 9

Slide 9 text

. . Введение RPC PyRO Пример: долгий метод Долгий метод, использующий GIL. def example(data): result = long_preparate(data) db.write(result) . . . 9

Slide 10

Slide 10 text

. . Введение RPC PyRO Пример: Producer Вместо вызова функции example(data) Используем паттерн Producer-Consumer queue = multiprocessing.Queue() queue.put(data) . . . 10

Slide 11

Slide 11 text

. . Введение RPC PyRO Пример: Consumer while True: data = queue.get() example(data) . . . 11

Slide 12

Slide 12 text

. . Введение RPC PyRO Пример: Consumer while True: data = queue_in.get() result = example(data) queue_out.put(result) . . . 12

Slide 13

Slide 13 text

. . Введение RPC PyRO Пример: Consumer while True: (data_type, data) = queue_in.get() if data_type == "db": result = example_db(data) elif data_type == "cache": result = example_cache(data) queue_out.put((data_type, result)) . . . 13

Slide 14

Slide 14 text

. . Введение RPC PyRO Подведение итогов Существуют ли другие, менее трудоемкие подходы? . . . 14

Slide 15

Slide 15 text

. . Введение RPC PyRO RPC PRC (Remote Procedure Call) - механизм, позволяющий программам вызывать функции, находящиеся в другом адресном пространстве. Как правило, на другом компьютере. . . . 15

Slide 16

Slide 16 text

. . Введение RPC PyRO RPC: Примеры CORBA Zero ICE Apache Thri . . . 16

Slide 17

Slide 17 text

. . Введение RPC PyRO RPC: Алгоритм применения Описание интерфейсов Генерация скелета интерфейса Реализация интерфейса . . . 17

Slide 18

Slide 18 text

. . Введение RPC PyRO RPC: Алгоритм применения Это разве python way? . . . 18

Slide 19

Slide 19 text

. . Введение RPC PyRO PyRO PyRO - Python Remote Objects Библиотека для создания удаленных объектов, к которым можно подключиться и вызывать методы как у обычных локальных объектов. . . . 19

Slide 20

Slide 20 text

. . Введение RPC PyRO PyRo: Класс объекта class Consumer(object): def example(data): result = long_preparate(data) db.write(result) . . . 20

Slide 21

Slide 21 text

. . Введение RPC PyRO PyRO: Сервер PRC import Pyro4 consumer = Consumer() daemon = Pyro4.Daemon() uri = daemon.register(consumer) print "Consumer uri =", uri daemon.requestLoop() . . . 21

Slide 22

Slide 22 text

. . Введение RPC PyRO PyRO: Сервер RPC Consumer uri = PYRO:obj_3d85fe79bd5d441280cb071421259745@localhost:62702 . . . 22

Slide 23

Slide 23 text

. . Введение RPC PyRO PyRO: Клиент RPC Было consumer = Consumer() consumer.example(data) Стало consumer = Pyro4.Proxy(uri) consumer.example(data) . . . 23

Slide 24

Slide 24 text

. . Введение RPC PyRO PyRO: Достоинства 100% Python Python 2.x, 3.x, PyPy, IronPython, Jython Windows, linux, mac os, ... Pickle tcp/ip uni est и examples Excep ons и traceback . . . 24

Slide 25

Slide 25 text

. . Введение RPC PyRO PyRO: Name Server python -m Pyro4.naming Клиент RPC nameserver = Pyro4.locateNS() uri = nameserver.lookup("example") consumer = Pyro4.Proxy(uri) . . . 25

Slide 26

Slide 26 text

. . Введение RPC PyRO PyRO: Name Server Сервер RPC consumer = Consumer() daemon = Pyro4.Daemon() uri = daemon.register(consumer) nameserver = Pyro4.locateNS() nameserver.register("example", uri) daemon.requestLoop() . . . 26

Slide 27

Slide 27 text

. . Введение RPC PyRO PyRO: Асинхронные вызовы consumer_async = Pyro4.async(consumer) asyncresult = consumer_async.example(data) if not asyncresult.ready: asyncresult.wait() print asyncresult.value . . . 27

Slide 28

Slide 28 text

. . Введение RPC PyRO PyRO: Oneway вызовы consumer = Pyro4.Proxy(uri) consumer._pyroOneway.add("example") consumer.example(dataA) consumer.example(dataB) . . . 28

Slide 29

Slide 29 text

. . Введение RPC PyRO PyRO: benchmarks Ubuntu 12.04 Intel core i5-2300 2000 connec ons 6.050 sec 331 conn/sec 2000 new proxy calls 10.675 sec 187 calls/sec 51269 kb transfer 132636 k/sec. 129.5 mb/sec 10000 calls 1.058 sec 8474 calls/sec 3000000 normal calls 1.012 sec 2963000/sec Normal method call is 373 mes faster than Pyro method call. . . . 29

Slide 30

Slide 30 text

. . Введение RPC PyRO Применение PyRO: пример 1 Вынесение действий, требующих продолжительного времени, но результат выполнения которых не требуется прямо сейчас. сохранение данных запись лога отправка email-ов сохранение фаилов ... . . . 30

Slide 31

Slide 31 text

. . Введение RPC PyRO Применение PyRO: пример 2 На каждом узле кластера запущено python-приложение, проводящее вычисления. . . . 31

Slide 32

Slide 32 text

. . Введение RPC PyRO Применение PyRO: пример 2 Связка iPython notebook и PyRO . . . 32

Slide 33

Slide 33 text

. . Введение RPC PyRO Применение PyRO: пример 3 Memory database class MemoryDB(): def load(): ... def request(filters): ... memdb = MemoryDB() memdb.load() ... data1 = memdb.request(filters1) data2 = memdb.request(filters2) . . . 33

Slide 34

Slide 34 text

. . Введение RPC PyRO Применение PyRO: пример 3 nameserver = Pyro4.locateNS() uri = nameserver.lookup("memorydb") memdb = Pyro4.Proxy(uri) ... data1 = memdb.request(filters1) data2 = memdb.request(filters2) . . . 34

Slide 35

Slide 35 text

. . Введение RPC PyRO Итого PyRO библиотека для организации RPC Объектный подход позволяет подменить объект на proxy и получить параллельность Простое и быстрое использование в существующем коде . . . 35

Slide 36

Slide 36 text

. . Введение RPC PyRO Вопросы? Оленин Михаил [email protected] CHTD - http://chtd.ru Блог - http://chtd.ru/blog/ twi er: @python_chtd @gimlis . . . 36