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

PyRO: python remote objects

PyRO: python remote objects

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

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