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

PyRO: python remote objects

PyRO: python remote objects

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

Moscow Python Meetup
PRO

April 11, 2013
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  13. .
    .
    Введение
    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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  22. .
    .
    Введение
    RPC
    PyRO
    PyRO: Сервер RPC
    Consumer uri =
    PYRO:[email protected]:62702
    .
    .
    .
    22

    View Slide

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

    View Slide

  24. .
    .
    Введение
    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

    View Slide

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

    View Slide

  26. .
    .
    Введение
    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

    View Slide

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

    View Slide

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

    View Slide

  29. .
    .
    Введение
    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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  33. .
    .
    Введение
    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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide