Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PyRO: python remote objects

PyRO: python remote objects

Михаил Оленин (ЧТД).
В докладе автор расскажет про библиотеку PyRO, с помощью которой можно создавать распределенные приложения. В таких приложениях объекты могут через сеть вызывать удаленные методы друг друга.

Avatar for Moscow Python Meetup

Moscow Python Meetup

April 11, 2013
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. . . Введение RPC PyRO О докладе PyRO - библиотека,

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

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

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

    с процессами. Достоинства: Настоящая параллельность Недостатки Раздельная память . . . 7
  5. . . Введение RPC PyRO Практическое использование threading Реализация: вызов

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

    использующий GIL. def example(data): result = long_preparate(data) db.write(result) . . . 9
  7. . . Введение RPC PyRO Пример: Producer Вместо вызова функции

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

    = queue_in.get() result = example(data) queue_out.put(result) . . . 12
  9. . . Введение 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
  10. . . Введение RPC PyRO RPC PRC (Remote Procedure Call)

    - механизм, позволяющий программам вызывать функции, находящиеся в другом адресном пространстве. Как правило, на другом компьютере. . . . 15
  11. . . Введение RPC PyRO RPC: Алгоритм применения Описание интерфейсов

    Генерация скелета интерфейса Реализация интерфейса . . . 17
  12. . . Введение RPC PyRO PyRO PyRO - Python Remote

    Objects Библиотека для создания удаленных объектов, к которым можно подключиться и вызывать методы как у обычных локальных объектов. . . . 19
  13. . . Введение RPC PyRO PyRo: Класс объекта class Consumer(object):

    def example(data): result = long_preparate(data) db.write(result) . . . 20
  14. . . Введение RPC PyRO PyRO: Сервер PRC import Pyro4

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

    = PYRO:obj_3d85fe79bd5d441280cb071421259745@localhost:62702 . . . 22
  16. . . Введение RPC PyRO PyRO: Клиент RPC Было consumer

    = Consumer() consumer.example(data) Стало consumer = Pyro4.Proxy(uri) consumer.example(data) . . . 23
  17. . . Введение 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
  18. . . Введение RPC PyRO PyRO: Name Server python -m

    Pyro4.naming Клиент RPC nameserver = Pyro4.locateNS() uri = nameserver.lookup("example") consumer = Pyro4.Proxy(uri) . . . 25
  19. . . Введение 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
  20. . . Введение RPC PyRO PyRO: Асинхронные вызовы consumer_async =

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

    Pyro4.Proxy(uri) consumer._pyroOneway.add("example") consumer.example(dataA) consumer.example(dataB) . . . 28
  22. . . Введение 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
  23. . . Введение RPC PyRO Применение PyRO: пример 1 Вынесение

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

    каждом узле кластера запущено python-приложение, проводящее вычисления. . . . 31
  25. . . Введение 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
  26. . . Введение RPC PyRO Применение PyRO: пример 3 nameserver

    = Pyro4.locateNS() uri = nameserver.lookup("memorydb") memdb = Pyro4.Proxy(uri) ... data1 = memdb.request(filters1) data2 = memdb.request(filters2) . . . 34
  27. . . Введение RPC PyRO Итого PyRO библиотека для организации

    RPC Объектный подход позволяет подменить объект на proxy и получить параллельность Простое и быстрое использование в существующем коде . . . 35
  28. . . Введение RPC PyRO Вопросы? Оленин Михаил [email protected] CHTD

    - http://chtd.ru Блог - http://chtd.ru/blog/ twi er: @python_chtd @gimlis . . . 36