В обычной CPython-сборке GIL защищает внутреннюю работу с объектами, но ограничивает параллельное исполнение Python-кода потоками. Для CPU-задач используют процессы, нативные расширения или free-threaded сборку.
Распаковка присваивает элементы нескольким именам и проверяет ожидаемую структуру, а индексирование извлекает отдельную позицию. Распаковка работает не только с кортежами, но и с другими iterable.
Последовательно проходите ключи пути и проверяйте наличие каждого в текущем объекте. В условии смешаны JavaScript undefined и Python-шаблон; ниже приведены оба согласованных варианта.
Да: асинхронный сервер можно построить на неблокирующих сокетах и selectors или использовать другую event-loop-библиотеку. Asyncio — готовая реализация, а не единственный способ конкурентного I/O.
super() возвращает прокси для поиска следующей реализации по MRO, а не просто обращение к прямому родителю. Это позволяет строить согласованные цепочки вызовов при наследовании.
Перенесите агрегацию в SQL: GROUP BY, агрегатный подзапрос, оконную функцию или заранее агрегированную таблицу. Prefetch всех дочерних строк убирает N+1, но не решает избыточную передачу данных.
CPU-квота cgroup ограничивает время выполнения, а не обязательно видимое число процессоров. Поэтому os.cpu_count() может видеть 64 CPU, хотя контейнеру разрешено лишь 2 CPU-времени.
Asyncio переключает корутины кооперативно в event loop, поэтому для ожидания I/O ему не требуется одновременное выполнение Python-потоков. GIL и асинхронность решают разные вопросы.
В CPython целые числа — объекты, а небольшие значения от −5 до 256 обычно переиспользуются из заранее созданного набора. Это деталь реализации, не общее правило языка Python.
Корутина — выполнение, которое может приостанавливаться и продолжаться. В Python вызов async def создаёт coroutine object; обычная функция выполняется сразу и возвращает результат.
Namespaces изолируют представление процессов, сети и файловых систем; cgroups учитывают и ограничивают ресурсы. CPU-лимит ограничивает доступное процессорное время, а память нельзя просто отложить.
Контекстный менеджер управляет входом и выходом из блока with: открытием и закрытием ресурса, захватом и освобождением блокировки. Он вызывает __enter__ и __exit__.