LINUX.ORG.RU

Python 3.14

 

Python 3.14

1

5

Вышел Python 3.14.

Из новшеств:

  • официальная поддержка свободной многопоточности (free-threading, PEP 779);
  • новый модуль compression.zstd для сжатия согласно Zstandard (PEP 784);
  • выражения except и except* теперь могут записываться без скобок (PEP 758);
  • многое другое.

Обзор на YouTube о производительности свежих версий Python.

Обзор изменений в диагностике ошибок на Хабре.

>>> Подробности на pythoninsider.blogspot.com

★☆

Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 7)
Ответ на: комментарий от rtxtxtrx

Теперь если начнешь икрементировать переменную в нескольких тредах, то в ней может оказаться неожиданное значение от 0..N

Не понял.

mx__ ★★★★★
()
Ответ на: комментарий от mx__

Ну питон он просто игрушечный. В нем до версии 3.14 эти операции были гарантированно атомарными благодаря GIL, а теперь быдлокодеры будут высирать кирпичи, когда у них счетчик в нескольких потоках будет чушь показывать… Ведь они были ограждены от этого

rtxtxtrx ★★★
()
Ответ на: комментарий от rtxtxtrx

Точнее он был игрушечный… Теперь он словно девственности лишился… Не суть, что анальной, но зато «повзрослел»

rtxtxtrx ★★★
()
Ответ на: комментарий от mx__

Ну раньше GIL за всем следил, а теперь никто, кроме твоего кода:

Iterators

Sharing the same iterator object between multiple threads is generally not safe and threads may see duplicate or missing elements when iterating or crash the interpreter.

Но кое-где, чтоб совсем всё без ручного контроля не развалилось, блокировок всё-таки отсыпали, просто менее глобальных:

Built-in types like dict, list, and set use internal locks to protect against concurrent modifications in ways that behave similarly to the GIL. However, Python has not historically guaranteed specific behavior for concurrent modifications to these built-in types, so this should be treated as a description of the current implementation, not a guarantee of current or future behavior.

OSBuster ★★
()
Последнее исправление: OSBuster (всего исправлений: 3)
Ответ на: комментарий от mx__

Короче я тебе даже пример хотел скинуть сразу, но он очень долго выполнялся, питон нагнул рачком моего маленького рязанчика:

❯ python --version
Python 3.14.0

~
❯ vim ./test_threading.py
Found existing alias for "vim". You should use: "vi"

~ 3m 10s
❯ python ./test_threading.py
Counter: 999767

~ 3m 15s
❯ cat ./test_threading.py
import threading

counter = 0


def count():
    global counter
    counter += 1


threads = []
for i in range(1000000):
    t = threading.Thread(target=count)
    t.start()
    threads.append(t)

for t in threads:
    t.join()

print("Counter:", counter)

А вообще странно такие истины «деду» объяснять

rtxtxtrx ★★★
()
Ответ на: комментарий от rtxtxtrx

Короче я тебе даже пример хотел скинуть сразу, но он очень долго выполнялся

Может пока он выполнялся у тебя было время посмотреть вот это и прокомментировать?

Python 3.14 (комментарий)

Или скажи, если не ждать!

OSBuster ★★
()
Ответ на: комментарий от rtxtxtrx

Для сравнения:

~
❯ python --version
Python 3.13.7

~
❯ python ./test_threading.py
Counter: 1000000
rtxtxtrx ★★★
()
Ответ на: комментарий от rtxtxtrx

Да ниче не изменится, просто можно теперь собрать питон без GIL. И для этой сборки написать весь код заново (а как вы хотели). Полезность зашкаливает.

bread
()
Ответ на: комментарий от rtxtxtrx

А что они там тестируют? Скорость коннектора базы данных? В том-то и дело…

В Питоне очень медленные коннекторы к базам данных? Все же тестируемые к одному и тому же контейнеру с базой данных обращаются.

Я смотрю там

import asyncio
import asyncpg
import multiprocessing

Т.е. оно в конкурентном режиме должно работать, как полагается. В чём дело?

OSBuster ★★
()
Последнее исправление: OSBuster (всего исправлений: 1)
Ответ на: комментарий от OSBuster

Т.е. оно в конкурентном режиме должно работать. В чём дело?

Помню когда давно общались с одним из авторов asyncio, спрашивали почему вот это сделано так плохо, ответили что это из-за гил.

Я так понял если гил убрали то должны переделать все эти либы (т.е. они уже не будут совместимы с < python-3.14) или что то новое залепить.

mx__ ★★★★★
()
Ответ на: комментарий от OSBuster

Я лишь скрин смотрел.

В Питоне очень медленные коннекторы к базам данных?

Да. Разница на порядок. asyncpg считается самым быстрым, но мне лень код смотреть. Он объективно ничего не отражает.

rtxtxtrx ★★★
()
Ответ на: комментарий от mx__

не должны… хотя там часто применяют тридпулэкзекутор для декодирования тела ответов от сервера, то там не должно что-то сломаться. ничего переписывать не надо. но вот треды без gil работают сейчас медленее чем с ним

rtxtxtrx ★★★
()
Ответ на: комментарий от mx__

Помню когда давно общались с одним из авторов asyncio, спрашивали почему вот это сделано так плохо, ответили что это из-за гил.

Но это ж максимально типовая задача - сделать селект в базу и отрендерить ответ в виде статуса, хедеров и строки тела. Ладно Гоу, но почему Руби, Кристалу и Ноде глобальная блокировка влияет гораздо меньше. Не в два же раза.

OSBuster ★★
()
Ответ на: комментарий от OSBuster

Ноде

Классно пошутил. V8 - это однопоточный, асинхронный движок для JavaScript

rtxtxtrx ★★★
()
Ответ на: комментарий от rtxtxtrx

Если не понял, то нет тредов, нет GIL

Тогда тем более, оно в одну калитку тогда шарашит в два раза быстрее. Мне просто было лень расписывать перечисление, думал, что и так понятно.

OSBuster ★★
()
Последнее исправление: OSBuster (всего исправлений: 1)
Ответ на: комментарий от rtxtxtrx

Да это он. Но попробуй подумать почему такие тесты не имеют смысла или спроси у чата гопоты какого.

Давай подумаем вместе, раз уж ты тут. Что ты предлагаешь замерять и как?

Потому, что в моем представлении для веб-приложения:

это ж максимально типовая задача - сделать селект в базу и отрендерить ответ в виде статуса, хедеров и строки тела.

OSBuster ★★
()
Ответ на: комментарий от rtxtxtrx

Что нужно поменять в этом бенчмарке чтобы он стал валидным по твоему мнению?

Неужели ответ - не использовать никакие бенчмарки, а руководствоваться только лишь духовной красотой и равновесием?

OSBuster ★★
()
Ответ на: комментарий от OSBuster

Тогда тем более, оно в одну калитку тогда шарашит в два раза быстрее. Мне просто было лень расписывать перечисление, думал, что и так понятно.

Это не совсем правильный тест. Насколько я вижу там в Руби не паралельности, нужны такие же запросы с НОДЫ и Питона.

mx__ ★★★★★
()
Последнее исправление: mx__ (всего исправлений: 1)
Ответ на: комментарий от mx__

Это не совсем правильный тест.

Так в первоначальном вопросе и был вопрос всё ли в порядке там с методикой измерений.

Насколько я вижу там в Руби не паралельности

Вот тут не понял.

OSBuster ★★
()
Последнее исправление: OSBuster (всего исправлений: 1)
Ответ на: комментарий от OSBuster

Да ничего. Скорость ничего не решает, решают простота и удобство разработки. И там я выше про апишки писал… С горизонтальным масштабированием у раби все плохо, нет ничего готового, позволяющего навайбкодить апишку из 1000 строк за пару вечеров

rtxtxtrx ★★★
()
Ответ на: комментарий от rtxtxtrx

Скорость ничего не решает, решают простота и удобство разработки.

Да, наедине с черепашьим питоном приходится вот так себя утешать. Как я говорил уже, без руби было бы вам совсем одиноко.

bread
()
Ответ на: комментарий от mx__

в смысле нет.

Есть.

Там в docker-compose.yml задаётся всем тестируемым cpus: 2

Там где application server это Puma, то он запущен независимо в двух процессах параллельных, в каждом процессе стоит значение в минимум 4 и максимум 20 тредов.

threads 4, 20
workers ENV.fetch("WORKERS").to_i

Там где application server это Falcon, то он тоже запущен с двумя воркерами, но традиционные треды, в отличие от Puma, не используют, а использует новомодные легковесные fibers, которые спаунит в каждом из этих двух воркеров сколько ему требуется, используя async библиотеку.

count ENV.fetch("WORKERS").to_i

У питоновсого Uvicorn тоже в настройках workers = int(os.getenv("WORKERS")) который равен 2. Как там дальше внутри них работает питоновский async я не в курсе.

Т.е. каждому тестируему окружению выделили два ядра и два воркера и один и тот же контейнер с БД.

OSBuster ★★
()
Последнее исправление: OSBuster (всего исправлений: 4)
Ответ на: комментарий от OSBuster

Ты путаешь всё. Тебя в кучу смешались люди, кони, пони. Асинхронное приложение однопоточно. Работа его построена над либ эвент. У тебя там есть основной цикл который слушает socket и переключает контекст когда приходят данные от сокета экономия такты процессора. Точнее он переключается как только выполнение доходит до ближайшего await. Тут всё упрощённо но в целом верно

rtxtxtrx ★★★
()
Ответ на: комментарий от OSBuster

А ювикорн имеет лишь опосредованное отношения к асинхронности. Он лишь запускает определённое количество инстансов и перезапускает их, если те падают.

rtxtxtrx ★★★
()
Ответ на: комментарий от rtxtxtrx

Ты путаешь всё. Тебя в кучу смешались люди, кони, пони. Асинхронное приложение однопоточно. Работа его построена над либ эвент. У тебя там есть основной цикл который слушает socket и переключает контекст когда приходят данные от сокета экономия такты процессора. Точнее он переключается как только выполнение доходит до ближайшего await. Тут всё упрощённо но в целом верно

Это ты всё путаешь, ничего не мешает запустить несколько копий, если у нас web-сервер cо stateless REST с независимым контекстом.

Речь же бы была про воркеры-процессы. Ты сам слабо понимаешь вообще о чём пишешь и как работают application servers, а строишь тут умника из себя. Вот твой же ChatGPT:

workers = int(os.getenv("WORKERS"))

What does this mean in the Uvicorn config?


That line means the number of worker processes that Uvicorn should start is being read from an environment variable named WORKERS.


It allows you to configure how many Uvicorn worker processes to run via an environment variable instead of hardcoding it.

This is common in deployment setups (like Docker, Kubernetes, or cloud environments) where you want to control concurrency dynamically.

Example:

If your .env file or environment has:
WORKERS=3
then Uvicorn will launch 3 worker processes, each capable of handling requests in parallel.

И Ноду можно запустить также в несколько процессов, что в том бенчмарке и делают с помощью cluster.fork(); для numCPUs = 2.

OSBuster ★★
()
Последнее исправление: OSBuster (всего исправлений: 3)
Ответ на: комментарий от OSBuster

Там в docker-compose.yml задаётся всем тестируемым cpus: 2

Это тут причем?

Ладно напишу по другому, там снизу прилепим вывод слова - «финиш». Когда оно выведется в случае Руби и в случае Питона.

mx__ ★★★★★
()
Ответ на: комментарий от OSBuster

Её и запускают в несколько процессов и ноду и питон этот хоть асинхронный хоть который использует потоки. Это просто лишняя сущность которая не даёт тебе посмотреть в суть

rtxtxtrx ★★★
()
Ответ на: комментарий от OSBuster

Форки - это немного другое, это не потоки, а уже отдельные процессы.

rtxtxtrx ★★★
()
Последнее исправление: rtxtxtrx (всего исправлений: 1)
Ответ на: комментарий от mx__

Это тут причем?

Это при том, что каждому контейнеру выделяется по 2 виртуальных CPU и запускается application server который стартует по 2 своих процесса на Ruby и Python. соответственно.

Внутри этих процессов каждый уже реализует асинхронность по своему, согласно своим для каждого языка реализациям, а нас же интересует итоговая произодительность наших веб-серверов, которые рендерят одно и тоже из одной и той же базы.

OSBuster ★★
()
Последнее исправление: OSBuster (всего исправлений: 3)
Ответ на: комментарий от OSBuster

Что там внутри этих процессов каждый уже реализует асинхронность по своему, согласно своим для каждого языка реализациям,

И где тут асинхроность у руби? Типа я снизу прилеплю вывод строки, он выведется а прога будет дальше крутиться?

mx__ ★★★★★
()
Ответ на: комментарий от mx__

И где тут асинхроность у руби? Типа я снизу прилеплю вывод строки, он выведется а прога будет дальше крутиться?

Ну да.

Falcon is a multi-process, multi-fiber rack-compatible HTTP server built on top of async, async-container and async-http. Each request is executed within a lightweight fiber and can block on up-stream requests without stalling the entire server process. Falcon supports HTTP/1 and HTTP/2 natively.

OSBuster ★★
()
Последнее исправление: OSBuster (всего исправлений: 2)
Ответ на: комментарий от mx__
  • Неблокирующие сокеты
  • Главный цикл main loop
  • Управление контекстом его выполнения
  • Рализация на калбеках, генераторах, промисах и тп

То что он кидал там по-моему на калбеках было. Дело не в способе в удобстве. Эти вложенные калбэки они превращаются со временем в стаю птиц, летящих на юг. Это говнокод который сложен для восприятия. Текущая реализация асинхронности в руби представляет собой говно, поэтому не взлетит, даже если она там быстрая какая-то. В ноде перешли же на промисы не просто ж так. [Надоело править ошибки распознания голоса]

rtxtxtrx ★★★
()
Последнее исправление: rtxtxtrx (всего исправлений: 3)
Ответ на: комментарий от rtxtxtrx

Вот вы вроде специалист по питону, я что то не пойму что там в коде питона понапичкано await ну допустим… но что то странный какой то код …

mx__ ★★★★★
()
Ответ на: комментарий от mx__

Просто дебагер запусти и по шагам смотри как выполняются эти асинхронные функции твои. Это наглядно будет

rtxtxtrx ★★★
()
Ответ на: комментарий от OSBuster

Falcon is a multi-process, multi-fiber rack-compatible HTTP server

Ну нет. Что это за фигня какая то.

Нужно писать код и запускать его так:

ruby прога.rb
python прога.py

А все остальное по моему мнению ернуда, вон я тут в начале сравнение скоростей кидал, так там на pypy работает как на си почти.

mx__ ★★★★★
()
Ответ на: комментарий от rtxtxtrx

поэтому не взлетит, даже если она там быстрая какая-то

Уже взлетела и обслуживает Shopify, компанию с капитализацией в 14 миллиардов долларов.

https://x.com/igrigorik/status/1976426479333540165

Falcon is now serving most of Shopify storefront traffic: web and API. It's solid, delivered big wins already, and unlocks a huge swath of new storefront optimizations we'll be trickling out over time. 

Причём это настоящий веб-хайлоад:

The company has over 5 million customers and processed $292.3 billion in transactions in 2024, of which 57% was in the United States.

https://en.wikipedia.org/wiki/Shopify

OSBuster ★★
()
Последнее исправление: OSBuster (всего исправлений: 1)
Ответ на: комментарий от mx__

Mypy почти умер. Он не даёт никакого профита. Поэтому уже упомянутый тут asyncpg написан на цитоне. О прикол-то в другом что у тебя всё упирается в сокеты. А не в процессорожрущие операции. Так что сервер написанный на голом c++ не даст какой-то фантастической производительности затраты на его написание будут больше чем на создании и поддерживании чего-то на питоне. Статическая типизация на сервере слишком дорогое удовольствие, она экономически нерентабельна до какого-то порога условно маленькой компании обходится дорого, какому-нибудь facebook уже будет экономия. Сравнивать иными словами сишку и питон нет смысла как и нет смысла сравнивать там какой синхронный фреймворк быстрее когда есть вон статистика какие языки изучают сейчас студенты и из неё можно сделать выводы каких специалистов на рынке труда будет больше и кто обойдётся дешевле. Нужно сделать вывод что руби нерентабелен

rtxtxtrx ★★★
()
Последнее исправление: rtxtxtrx (всего исправлений: 2)
Ответ на: комментарий от rtxtxtrx

О прикол-то в другом что у тебя всё упирается в сокеты.

В смысле у кого у меня? Я пытаюсь показать что код в примере на Питон написан не правильно, причем это видно без всяких дебаггеров. А тут еще Фалкон всплыл, зачем автор так людям голову морочит … не понимаю.

mx__ ★★★★★
()
Ответ на: комментарий от mx__

Доказывать нет смысла. Потому что вне зависимости от того правильные результаты неправильные это никак не изменит ситуацию рыночек всё давно порешал

rtxtxtrx ★★★
()
Ответ на: комментарий от mx__

Нужно писать код и запускать его так

А как он запускается во вашему?

Если запустить ps в контейнере во время работы, то вы увидите процесс root 1 ruby /path/to/your/app/falcon.rb

OSBuster ★★
()
Последнее исправление: OSBuster (всего исправлений: 2)
Ответ на: комментарий от mx__

Я пытаюсь показать что код в примере на Питон написан не правильно

Вот это уже интересно и было в самом первом моём вопросе. Что там нужно исправить чтобы было честное сравнение?

OSBuster ★★
()
Последнее исправление: OSBuster (всего исправлений: 1)
Ответ на: комментарий от OSBuster

Вот это уже интересно и было в самом первом моём вопросе. Что там нужно исправить чтобы было честное сравнение?

ну для начала нужно определиться что будет юзать питон за место фалкона. Какой нибудь fasapi или https://github.com/cherrypy/cheroot и т.д.

mx__ ★★★★★
()
Ответ на: комментарий от mx__

ну для начала нужно определиться что будет юзать питон за место фалкона. Какой нибудь fasapi или https://github.com/cherrypy/cheroot и т.д.

Т.е. Uvicorn не подходит и есть более быстрые альтернативы, которые тоже нужно добавить в сравнение?

OSBuster ★★
()
Последнее исправление: OSBuster (всего исправлений: 1)
Ответ на: комментарий от OSBuster

Ну для начала нужно чтобы изменили заголовки, слова Uvicorn я там нигде не видел.

P.S. gunicorn, uvicorn , hypercorn я без понятие сколько всего этих вебсерверов на питоне и то что тестируют именно их.

mx__ ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.