Проект по интеграции поддержки многопоточности в Python и релиз PyPy 1.3

В рамках проекта "newthreading" подготовлен прототип решения для добавления поддержки многопоточности в интерпретатор языка программирования Python, параллельное выполнение классов в котором ограничено из-за применения глобальной блокировки (GIL - Global Interpreter Lock). Начальная реализация технологии newthreading написана в виде модуля на языке Python и не обеспечивает заметного роста производительности, демонстрируя лишь принцип работы предложенной концепции.

API модуля "newthreading" включает реализацию функций стандартного модуля "threading", расширяя их дополнительными средствами для организации синхронизации между параллельно выполняющимися классами. Модулем поддерживаются понятия "атомарный объект" и "синхронизированный объект", реализуемые через классы AtomicObject и SynchronizedObject. Основная идея состоит в том, что создаваемые пользователями классы, если они являются потомками SynchronizedObject, автоматически устанавливают блокировку при входе в класс и снимают ее при выходе или при ситуации блокировки потока внутри класса. Соответственно при таком подходе полностью исключается ситуация одновременной активности двух потоков при выполнении одного класса. Дополнительно, внешние объекты могут передаваться (или приниматься) в SynchronizedObject-объекты только после их перевода в специальное состояние заморозки ("frozen").

Основным недостатком предложенного метода является нарушение совместимости с текущей реализацией Python при организации многопоточной работы. Разработчики отмечают, что частично проблема решается тем, что при выполнении однопоточных программ семантика Python полностью сохраняется, но при задействовании механизма многопоточности правила меняются и некоторые из динамических возможностей языка отключаются.

В заключение, можно отметить выход релиза проекта PyPy 1.3, в рамках которого разрабатывается реализации языка Python, написанная на языке Python. Несмотря на абсурдность подобной идеи на первый взгляд, благодаря задействованию JIT-компилятора, на лету транслирующего некоторые элементы в машинный код, минуя фазу интерпретации байткода в виртуальной машине, PyPy при выполнении некоторых операций в несколько раз обогняет по производительности классическую реализацию Python на языке Си. Ценой высокой производительности и использования JIT-компиляции является заметно более высокое потребление памяти.

В PyPy также поддерживается бесстековый (Stackless) режим работы, позволяющий добиться массового параллельного выполнения микро-нитей (micro-threads). Для выполнения кода к которому нет доверия реализован режим изолированного выполнения, отличающегося от sandbox в CPython полной поддержкой всех возможностей языка, без выделения unsafe-функций. Дополнительно на базе технологий PyPy созданы бэкенды для генерации в PyPy байткода для LLVM и виртуальных машин .NET/CLI и Java. Отдельно на базе PyPy ведется разработка реализаций на языке Python интерпретаторов Prolog, Smalltalk, JavaScript, Io и Scheme.

В новой версии PyPy добавлена тестовая возможность загрузки расширяющих функциональность модулей, написанных на языке Си для CPython. Другим важным улучшением PyPy 1.3 является проведение большой работы по оптимизации и стабилизации кода JIT-компилятора.

©  OpenNet