Бібліотека Runloom додає корутини у стилі Go до Python без GIL
Відкритий проєкт пропонує стек-корутини без синтаксису <code>async/await</code>, проте максимальна віддача вимагає складання Python з вимкненим блокуванням GIL.
Спільнота незалежних розробників представила бібліотеку Runloom, яка реалізує механізм корутин у стилі Go для Python. Проєкт дозволяє обробляти операції введення-виведення без використання синтаксичних конструкцій async та await, зберігаючи звичний синхронний стиль коду.
В основі рішення лежить перемикач контексту на асемблері, C-планувальник завдань з алгоритмом work-stealing та мережевий стек netpoll. Сумісність реалізовано через динамічну підміну системних викликів (monkeypatching) у модулях на зразок socket, time і threading. Коли операція блокується, планувальник призупиняє конкретну корутину та передає процесор іншим завданням, не зупиняючи потік операційної системи. Для сумісності з наявними проєктами додано міст до asyncio.
За бенчмарками автора проєкту, швидкість створення завдань у чистому C досягає 2,29 млн операцій на секунду проти 2,10 млн у Go. Утім, виклик створення корутин із коду на Python сповільнює показник до 1,35 млн на секунду — близько 65% від швидкості Go. Пропускна здатність на тестах keep-alive склала 596 тисяч запитів на секунду проти 603 тисяч у Go.
Практичне впровадження має суттєві технічні ціни: кожна призупинена корутина потребує приблизно в 3,3 раза більше оперативної пам'яті, ніж горутина, через необхідність зберігати структури кадрів CPython. Крім того, розподіл навантаження між усіма ядрами працює лише у збірках Python 3.13t+ без глобального блокування інтерпретатора (GIL). У стандартному режимі бібліотека залишається лише альтернативним синтаксичним інтерфейсом до асинхронності.
Джерело: habr
Коментарі
Допоможи покращити наступну версію: Додавай контекст або пропонуй виправлення. Після AI-перевірки коментарі можуть отримати бали для переписування. Перевірка й оновлення потребують часу; повна шкала не гарантує нової версії.