Введение

Альтернативная реализация Python

Stackless Python, или Stackless, — это интерпретатор языка программирования Python, получивший такое название, поскольку он не зависит от стека вызовов C для организации собственного стека. На практике Stackless Python использует стек C, но он очищается между вызовами функций. Наиболее заметной особенностью Stackless являются микропотоки, позволяющие избежать значительной части накладных расходов, связанных с обычными потоками операционной системы. Помимо возможностей Python, Stackless также добавляет поддержку сопрограмм, каналов связи и сериализации задач.

Дизайн

С Stackless Python, работающая программа разделена на микропотоки, которые управляются самим языковым интерпретатором, а не ядром операционной системы — переключение контекста и планирование задач выполняются исключительно в интерпретаторе (такие потоки также рассматриваются как разновидность "зелёных" потоков). Микропотоки управляют выполнением различных подзадач в программе на одном ядре процессора. Таким образом, они являются альтернативой асинхронному программированию, основанному на событиях, и позволяют избежать накладных расходов, связанных с использованием отдельных потоков для программ, работающих на одном ядре (поскольку не требуется переключение между пользовательским и режимом ядра, что может снизить загрузку процессора). Хотя микропотоки упрощают работу с подзадачами на одном ядре, Stackless Python не устраняет глобальную блокировку интерпретатора (GIL) CPython и не использует несколько потоков и/или процессов. Следовательно, он обеспечивает только кооперативную многозадачность на общем процессоре, но не параллелизм (вытесняющее планирование изначально отсутствовало, но теперь реализовано в некоторой форме). Для использования нескольких ядер процессора по-прежнему потребуется создать систему межпроцессного взаимодействия поверх процессов Stackless Python. Из-за значительного количества изменений в исходном коде Stackless Python нельзя установить на существующую установку Python как расширение или библиотеку. Это самостоятельный, полноценный дистрибутив Python. Большинство функций Stackless также были реализованы в PyPy, самодостаточном интерпретаторе Python и JIT-компиляторе.

Использование

Хотя Stackless в целом является отдельным дистрибутивом, его функциональность переключения контекста была успешно реализована в виде расширения CPython под названием greenlet. Она используется рядом библиотек (например, gevent) для обеспечения решения, основанного на зелёных потоках, для CPython. Впоследствии Python получил собственное встроенное решение для зелёных потоков: await/async. Stackless широко используется в реализации многопользовательской онлайн-игры Eve Online, а также в почтовой платформе IronPort.