Slide 1

Slide 1 text

Покрываем “ржавчиной” Python Иван Кривошеев

Slide 2

Slide 2 text

Иван Кривошеев О себе ● Ведущий разработчик в продукте PT Sandbox ● Пишу на Python и Rust (в проде) ● 10 лет в разработке ● Люблю Open Source ● Вечерами пишу на Си

Slide 3

Slide 3 text

● Почему стоит покрывать Python “ржавчиной” ● Как покрывать Python “ржавчиной” ● Поговорим про сборку пакета на Rust для Python ● Проблемы при интеграции Python и Rust О чем доклад

Slide 4

Slide 4 text

Почему стоит покрывать Python “ржавчиной”

Slide 5

Slide 5 text

● Оптимизация узких мест в Python ● Возможность параллельной обработки с использованием нескольких ядер ● Перестать блокировать event-loop при “тяжелых” CPU задачах Задачи

Slide 6

Slide 6 text

● Компилируется в бинарный код ● Легко интегрируется с Python ● Имеет хорошую экосистему ● Помогает не “выстрелить себе в ногу” Требования

Slide 7

Slide 7 text

Кандидаты С С++ Rust

Slide 8

Slide 8 text

Почему Rust ● Есть учебник (https://doc.rust-lang.org/book/) ● Прекрасная документация (https://docs.rs/) ● Удобная система сборки проектов ● Концепция владения объектами ● Легкая в освоении многопоточность ● Очень трудно “выстрелить себе в ногу” ● Удобная интеграция с Python

Slide 9

Slide 9 text

Как покрывать Python “ржавчиной” 1. Отдельный микросервис 2. “Сишный” интерфейс на Rust 3. PyO3

Slide 10

Slide 10 text

Как покрывать Python “ржавчиной” 1. Отдельный микросервис. Проблема - сложная интеграция 2. “Сишный” интерфейс на Rust. Проблема - монструозный код и много обвязки

Slide 11

Slide 11 text

PyO3 ● https://github.com/PyO3/pyo3 ● https://docs.rs/pyo3/latest/pyo3/ ● https://pyo3.rs/v0.20.0/

Slide 12

Slide 12 text

Функция

Slide 13

Slide 13 text

Класс

Slide 14

Slide 14 text

Модуль

Slide 15

Slide 15 text

Cargo.toml

Slide 16

Slide 16 text

setup.py

Slide 17

Slide 17 text

Сборка

Slide 18

Slide 18 text

Wheel {distribution}-{version}(-{build tag})?-{python tag}-{abi tag}-{platform tag}.whl ● distribution - имя пакета ● version - версия пакета ● build tag - опциональное поле с номером сборки Ссылки: ● https://packaging.python.org/en/latest/specifications/platform-compatibility-tag s/#platform-compatibility-tags ● https://peps.python.org/pep-0427/

Slide 19

Slide 19 text

Python tag ● py: Generic Python ● cp: Cpython ● ip: IronPython ● pp: PyPy ● jy: Jython

Slide 20

Slide 20 text

ABI3 tag

Slide 21

Slide 21 text

ABI соглашение на бинарном уровне, после компиляции программы в бинарный код > ABI/API API соглашение на уровне кода, до компиляции программы в бинарный код. >

Slide 22

Slide 22 text

ABI tag ● none - не требует никакой совместимости на уровне ABI ● cp33d - CPython 3.3 с отладочными символами ● abi3

Slide 23

Slide 23 text

Python Limited С API/Stable ABI ● Python3.2 - предоставил ограниченный набор из Python С API и дал Гарантии ● Python дает гарантии что в libpython*.so будет определённый набор “символов”, которые останутся совместимы во всех Python3.x версиях ● .abi3.so Ссылка: https://docs.python.org/3/c-api/stable.html

Slide 24

Slide 24 text

Ограничения ● Может уменьшиться скорость исполнения кода ● Не дает гарантии, что код собранный под Python младшей версии, соберется под Python более старшей версии ● Python не проверяет, что .abi3.so - собрано под запускаемой версией Python ● Стабильность ABI - также зависит от платформы, на которой запускается модуль

Slide 25

Slide 25 text

manylinux ● manylinux_${GLIBC_MAJOR}_${GLIBC_MINOR}_${ARCH} ● manylinux1_* - алиас: manylinux_2_5 ● manylinux2010_* - алиас: manylinux_2_12 ● manylinux2014_* - алиас: manylinux_2_14 Ссылка: https://peps.python.org/pep-0600/

Slide 26

Slide 26 text

setup.py

Slide 27

Slide 27 text

Cargo.toml

Slide 28

Slide 28 text

Сборка

Slide 29

Slide 29 text

Python

Slide 30

Slide 30 text

Проблемы ● Неудобная работы с памятью ● Неудобная работа с исключениями ● На больших проектах страдает время сборки ● PyO3 - неконсистентное API ● PyO3 - много неявного копирования и создания объектов

Slide 31

Slide 31 text

Спасибо!

Slide 32

Slide 32 text

habrahabr.ru/ company/pt vk.com/ ptsecurity t.me/ positive_technologies t.me/ positive_investing

Slide 33

Slide 33 text

[email protected] ptsecurity.com