ℹ️ Skipped - page is already crawled
| Filter | Status | Condition | Details |
|---|---|---|---|
| HTTP status | PASS | download_http_code = 200 | HTTP 200 |
| Age cutoff | PASS | download_stamp > now() - 6 MONTH | 0.1 months ago |
| History drop | PASS | isNull(history_drop_reason) | No drop reason |
| Spam/ban | PASS | fh_dont_index != 1 AND ml_spam_score = 0 | ml_spam_score=0 |
| Canonical | PASS | meta_canonical IS NULL OR = '' OR = src_unparsed | Not set |
| Property | Value |
|---|---|
| URL | https://otus.ru/nest/post/390/ |
| Last Crawled | 2026-04-07 15:08:21 (3 days ago) |
| First Indexed | 2018-10-08 11:56:13 (7 years ago) |
| HTTP Status Code | 200 |
| Meta Title | Как проще всего избежать ограничений GIL? | OTUS |
| Meta Description | Как проще всего избежать ограничений GIL? в OTUS, только интересные посты! |
| Meta Canonical | null |
| Boilerpipe Text | Теги: python, gil, global interpreter lock, multiprocessing, fork, read-only кэш, copy-on-write, top, ps, rss, vms, reference counting, shared memory, mmap
Многие из вас знают, что в Python есть
GIL
–
Global Interpreter Lock
, тот самый, который не даёт запускать несколько потоков и нагружать ядра процессора. Отчасти это так, но за
GIL
в Python скрывается очень много всего.
И вот несколько фактов о нём:
—
GIL
будет всегда. Но это не точно.
— Захват
GIL
– одна из первых инструкций, которая выполняется в начале работы вашего кода.
— Блокировка переключается каждые 100 инструкций байт-кода до версии 3.2.
— Однако в Python до версии 3.2 у нас была возможность управлять этой цифрой. После – нет.
— Всё потому, что в Python 3.2 и выше
GIL
был очень сильно переписан. Теперь блокировка переключается по времени.
— Потоки соревнуются за захват
GIL
, у некоторых из них, например, тех, которые активно занимаются вводом\выводом, это получается чаще.
— До версии 3.2 есть тонкости обработки сигналов при многопоточном коде – ваш код иногда может не получить сигнал от ОС.
— Планированием выполнения потоков занимается ОС, а Python только говорит ей, как ему бы хотелось.
— Вы можете обойти ограничения в своём коде при помощи multiprocessing.
— Или написав своё Python C Extension.
Рассмотрим один из самых очевидных способов избежать ограничений
GIL
’а при выполнении
CPU-intensive
задач.
Модуль multiprocessing
Запускай по процессу на ядро и вперёд! К сожалению, очевидный способ не значит, что простой. Допустим, запускается процесс, который
fork
’ает дочерний процесс, но перед этим загружает в память какой-нибудь большой
read-only кэш
, необходимый этим процессам для функционирования.
Вот это класс! Казалось бы, за счёт
copy-on-write
(предполагаем Linux) оба процесса будут
видеть
один и тот же кэш, но дублировать его в памяти не придётся. В
top
(ну или
ps
) увидим, что у процессов
RSS
(
Resident Set Size
) меньше
VMS
(
Virtual Memory Size
). А если кто-то из них и решит туда записать, то ОС скопирует в его адресное пространство только нужные страницы.
Всё так, но есть нюансы
В Python управление памятью осуществляется с помощью
reference counting
. И даже простой цикл по списку, например, вызывает увеличение счётчика ссылок находящихся в нём объектов. То есть, скорее всего, наш большой кэш не останется надолго в общей памяти, а быстро скопируется в адресные пространства процессов.
Чтобы этого избежать нужно положить кэш в
shared memory
, то есть разделяемую память, которая является общей для обоих процессов.
Multiprocessing
даёт нам такую возможность, но выбор опций достаточно скудный: можно создать одно значение или массив. Для чего-то более сложного придётся использовать
mmap
, но программировать это будет ещё сложнее.
Есть вопрос? Напишите в комментариях! |
| Markdown | 

\>
Скидка 10% на курсы из спецкаталога — до 19 апреля
Скидка 10% на курсы из спецкаталога — до 19 апреля
[Выбрать курс](https://otus.ru/catalog/courses?utm_source=banner_course%20&utm_medium=chank&utm_campaign=general_site&utm_content=tayshie_skidki&utm_term=05-04-2026-19-04-2026)
[](https://otus.ru/)
Обучение
Направления
[Программирование (115)](https://otus.ru/categories/programming/) [Архитектура (17)](https://otus.ru/categories/architecture/) [Data Science (27)](https://otus.ru/categories/data-science/) [Инфраструктура (59)](https://otus.ru/categories/operations/) [GameDev (6)](https://otus.ru/categories/gamedev/) [Безопасность (15)](https://otus.ru/categories/information-security-courses/) [Управление (44)](https://otus.ru/categories/marketing-business/) [Аналитика и анализ (25)](https://otus.ru/categories/analytics/) [Бизнес и продукт в IT (26)](https://otus.ru/categories/business-product/) [Импортозамещение (15)](https://otus.ru/categories/import-substitution/) [Тестирование (13)](https://otus.ru/categories/testing/) [Нейросети (11)](https://otus.ru/categories/neural_networks/) [IT без программирования (19)](https://otus.ru/categories/it-bez-programmirovanija/) [Корпоративные курсы (27)](https://otus.ru/categories/corporate/)
События
[Календарь запуска курсов](https://otus.ru/lessons/calendar/2026/) [Календарь мероприятий](https://otus.ru/events/near/)
Другое
[Специализации (13)](https://otus.ru/categories/spec/) [Подготовительные курсы (14)](https://otus.ru/categories/online/) [Подписка на курсы](https://otus.ru/subscription) [Проверьте свои знания](https://otus.ru/tests)
OTUS рекомендует
[  Курс Скидка 15600 ₽ Технический директор / CTO 9 апреля , 2026 · 5 месяцев](https://otus.ru/lessons/cto/)
Информация
OTUS
[О компании](https://otus.ru/about) [СМИ о нас](https://otus.ru/smi/) [OTUS Журнал](https://otus.ru/journal/) [OTUS Директ](https://direct.otus.ru/) [Сведения об образовательной организации](https://otus.ru/legal/common/) [Контактная информация](https://otus.ru/contacts/)
Студентам
[Отзывы](https://otus.ru/reviews) [Как выбрать курс](https://landing.otus.ru/about-otus) [Истории выпускников](https://landing.otus.ru/gallery) [Наши преподаватели](https://otus.ru/instructors/) [Наши партнеры](https://otus.ru/employers/all/) [Программа лояльности](https://otus.ru/about/loyalty/) [Вопросы и ответы](https://otus.ru/faq/)
Преподавателям
[Стать преподавателем](https://otus.ru/teach/) [Наши преподаватели](https://otus.ru/instructors/) [База знаний](https://otus.ru/nest/dlja-prepodavatelej/)
OTUS рекомендует
[  Курс Скидка 15600 ₽ Технический директор / CTO 9 апреля , 2026 · 5 месяцев](https://otus.ru/lessons/cto/)
Ответим на ваши вопросы
[\+7 499 938-92-02](<tel:+7 499 938-92-02>)
[Компаниям](https://otus.ru/b2b)
Зарегистрироваться
Войти
- Обучение
- Информация
- Компаниям
Направления
[Программирование (115)](https://otus.ru/categories/programming/) [Архитектура (17)](https://otus.ru/categories/architecture/) [Data Science (27)](https://otus.ru/categories/data-science/) [Инфраструктура (59)](https://otus.ru/categories/operations/) [GameDev (6)](https://otus.ru/categories/gamedev/) [Безопасность (15)](https://otus.ru/categories/information-security-courses/) [Управление (44)](https://otus.ru/categories/marketing-business/) [Аналитика и анализ (25)](https://otus.ru/categories/analytics/) [Бизнес и продукт в IT (26)](https://otus.ru/categories/business-product/) [Импортозамещение (15)](https://otus.ru/categories/import-substitution/) [Тестирование (13)](https://otus.ru/categories/testing/) [Нейросети (11)](https://otus.ru/categories/neural_networks/) [IT без программирования (19)](https://otus.ru/categories/it-bez-programmirovanija/) [Корпоративные курсы (27)](https://otus.ru/categories/corporate/)
События
[Календарь запуска курсов](https://otus.ru/lessons/calendar/2026/) [Календарь мероприятий](https://otus.ru/events/near/)
Другое
[Специализации (13)](https://otus.ru/categories/spec/) [Подготовительные курсы (14)](https://otus.ru/categories/online/) [Подписка на курсы](https://otus.ru/subscription) [Проверьте свои знания](https://otus.ru/tests)
OTUS рекомендует
[  Курс Скидка 15600 ₽ Технический директор / CTO 9 апреля , 2026 · 5 месяцев](https://otus.ru/lessons/cto/)
OTUS
[О компании](https://otus.ru/about) [СМИ о нас](https://otus.ru/smi/) [OTUS Журнал](https://otus.ru/journal/) [OTUS Директ](https://direct.otus.ru/) [Сведения об образовательной организации](https://otus.ru/legal/common/) [Контактная информация](https://otus.ru/contacts/)
Студентам
[Отзывы](https://otus.ru/reviews) [Как выбрать курс](https://landing.otus.ru/about-otus) [Истории выпускников](https://landing.otus.ru/gallery) [Наши преподаватели](https://otus.ru/instructors/) [Наши партнеры](https://otus.ru/employers/all/) [Программа лояльности](https://otus.ru/about/loyalty/) [Вопросы и ответы](https://otus.ru/faq/)
Преподавателям
[Стать преподавателем](https://otus.ru/teach/) [Наши преподаватели](https://otus.ru/instructors/) [База знаний](https://otus.ru/nest/dlja-prepodavatelej/)
OTUS рекомендует
[  Курс Скидка 15600 ₽ Технический директор / CTO 9 апреля , 2026 · 5 месяцев](https://otus.ru/lessons/cto/)
Ответим на ваши вопросы
[\+7 499 938-92-02](<tel:+7 499 938-92-02>)
[Блоги](https://otus.ru/nest/ "Блоги") [Посты](https://otus.ru/nest/posts/ "Посты") [Лучшие](https://otus.ru/nest/best/ "Лучшие") [Участники](https://otus.ru/nest/users/ "Участники")
[Блоги](https://otus.ru/nest/ "Блоги") [Посты](https://otus.ru/nest/posts/ "Посты") [Лучшие](https://otus.ru/nest/best/ "Лучшие") [Участники](https://otus.ru/nest/users/ "Участники")
[Станислав](https://otus.ru/profile/2528/)
08\.10.18 в 09:39
# Как проще всего избежать ограничений GIL?
[Python](https://otus.ru/nest/python/ "Python") → [Полезные материалы по Python](https://otus.ru/nest/python-art/ "Полезные материалы по Python")
Теги: python, gil, global interpreter lock, multiprocessing, fork, read-only кэш, copy-on-write, top, ps, rss, vms, reference counting, shared memory, mmap

Многие из вас знают, что в Python есть **GIL** – *Global Interpreter Lock*, тот самый, который не даёт запускать несколько потоков и нагружать ядра процессора. Отчасти это так, но за **GIL** в Python скрывается очень много всего.И вот несколько фактов о нём:
— **GIL** будет всегда. Но это не точно. — Захват **GIL** – одна из первых инструкций, которая выполняется в начале работы вашего кода. — Блокировка переключается каждые 100 инструкций байт-кода до версии 3.2. — Однако в Python до версии 3.2 у нас была возможность управлять этой цифрой. После – нет. — Всё потому, что в Python 3.2 и выше **GIL** был очень сильно переписан. Теперь блокировка переключается по времени. — Потоки соревнуются за захват **GIL**, у некоторых из них, например, тех, которые активно занимаются вводом\\выводом, это получается чаще. — До версии 3.2 есть тонкости обработки сигналов при многопоточном коде – ваш код иногда может не получить сигнал от ОС. — Планированием выполнения потоков занимается ОС, а Python только говорит ей, как ему бы хотелось. — Вы можете обойти ограничения в своём коде при помощи multiprocessing. — Или написав своё Python C Extension.
Рассмотрим один из самых очевидных способов избежать ограничений **GIL**’а при выполнении **CPU-intensive** задач.
## Модуль multiprocessing
Запускай по процессу на ядро и вперёд! К сожалению, очевидный способ не значит, что простой. Допустим, запускается процесс, который **fork**’ает дочерний процесс, но перед этим загружает в память какой-нибудь большой **read-only кэш**, необходимый этим процессам для функционирования.
Вот это класс! Казалось бы, за счёт **copy-on-write** (предполагаем Linux) оба процесса будут *видеть* один и тот же кэш, но дублировать его в памяти не придётся. В **top** (ну или **ps**) увидим, что у процессов **RSS** (*Resident Set Size*) меньше **VMS** (*Virtual Memory Size*). А если кто-то из них и решит туда записать, то ОС скопирует в его адресное пространство только нужные страницы.
## Всё так, но есть нюансы
В Python управление памятью осуществляется с помощью **reference counting**. И даже простой цикл по списку, например, вызывает увеличение счётчика ссылок находящихся в нём объектов. То есть, скорее всего, наш большой кэш не останется надолго в общей памяти, а быстро скопируется в адресные пространства процессов.
Чтобы этого избежать нужно положить кэш в **shared memory**, то есть разделяемую память, которая является общей для обоих процессов. **Multiprocessing** даёт нам такую возможность, но выбор опций достаточно скудный: можно создать одно значение или массив. Для чего-то более сложного придётся использовать **mmap**, но программировать это будет ещё сложнее.
*Есть вопрос? Напишите в комментариях\!*
Поделиться
8
[0](https://otus.ru/nest/post/390/#comments)
63
Автор
[Станислав](https://otus.ru/profile/2528/)
Рейтинг:
\+300
3229 дней
Похожие посты
[Get ready to run back: ещё одна проблема регулярных выражений](https://otus.ru/nest/post/140/ "Get ready to run back: ещё одна проблема регулярных выражений")
[0](https://otus.ru/nest/post/140/#comments)
[\+18](https://otus.ru/nest/post/140/#author_block)
[MergeSort + InsertionSort + хитрые эвристики = ?](https://otus.ru/nest/post/144/ "MergeSort + InsertionSort + хитрые эвристики = ?")
[0](https://otus.ru/nest/post/144/#comments)
[\+13](https://otus.ru/nest/post/144/#author_block)
[Подводный камень в Default-настройках СУБД](https://otus.ru/nest/post/149/ "Подводный камень в Default-настройках СУБД")
[1](https://otus.ru/nest/post/149/#comments)
[\+19](https://otus.ru/nest/post/149/#author_block)
[Расстояние Вассерштейна: WGAN и 2 кучи земли](https://otus.ru/nest/post/182/ "Расстояние Вассерштейна: WGAN и 2 кучи земли")
[0](https://otus.ru/nest/post/182/#comments)
[\+11](https://otus.ru/nest/post/182/#author_block)
[Adversarial Autoencoders: порождение дискретных объектов](https://otus.ru/nest/post/183/ "Adversarial Autoencoders: порождение дискретных объектов")
[0](https://otus.ru/nest/post/183/#comments)
[\+15](https://otus.ru/nest/post/183/#author_block)
0 комментариев
Для комментирования необходимо [авторизоваться](https://otus.ru/login/?next=https%3A%2F%2Fotus.ru%2Fnest%2Fpost%2F390%2F)
Популярное
Сегодня тут пусто
Посещая наш сайт, вы принимаете [политику использования cookie-файлов](https://otus.ru/legal/cookie/)
ОК
[О нас](https://otus.ru/about "О нас")
[СМИ о нас](https://otus.ru/smi/ "СМИ о нас")
[Отзывы](https://otus.ru/reviews "Отзывы")
[Контакты](https://otus.ru/contacts/ "Контакты")
[Блог](https://otus.ru/journal/ "Блог")
[FAQ](https://otus.ru/faq/ "FAQ")
[Канал в Telegram](https://ttttt.me/Otusjava)
[Группа в Telegram](https://ttttt.me/joinchat/JMakp0NXc-L8nNneHCtx7A)
[Корпоративное обучение](https://otus.ru/b2b "Корпоративное обучение")
[Каталог курсов](https://otus.ru/lessons/ "Каталог курсов")
[Программы лояльности](https://otus.ru/about/loyalty/ "Программы лояльности")
[Каталог профессий](https://otus.ru/professions/ "Каталог профессий")
[Наши партнеры](https://otus.ru/employers/all/ "Наши партнеры")
[Стать преподавателем](https://otus.ru/teach/ "Стать преподавателем")
Подписка на новости IT, анонсы открытых уроков, спец. предложения
По всем вопросам пишите на [help@otus.ru](mailto:help@otus.ru "help@otus.ru")
[Сведения об образовательной организации](https://otus.ru/legal/common/ "Сведения об образовательной организации")
[OTUS является аккредитованной IT-компанией](https://otus.ru/legal/it_company_accreditation/ "OTUS является аккредитованной IT-компанией")
[Сведения о рекомендательных технологиях](https://otus.ru/legal/recommendations/ "Сведения о рекомендательных технологиях")
[В реестре отечественного ПО №24216](https://reestr.digital.gov.ru/reestr/2704482/ "В реестре отечественного ПО №24216")
© 2015-2026 OTUS
[Условия использования сервиса](https://otus.ru/legal/terms/ "Условия использования сервиса")
Премия Рунета
2018
Премия Рунета
2018
Подписка на новости IT, анонсы открытых уроков, спец. предложения
По всем вопросам пишите на [help@otus.ru](mailto:help@otus.ru "help@otus.ru")
[Сведения об образовательной организации](https://otus.ru/legal/common/ "Сведения об образовательной организации")
[OTUS является аккредитованной IT-компанией](https://otus.ru/legal/it_company_accreditation/ "OTUS является аккредитованной IT-компанией")
[Сведения о рекомендательных технологиях](https://otus.ru/legal/recommendations/ "Сведения о рекомендательных технологиях")
[В реестре отечественного ПО №24216](https://reestr.digital.gov.ru/reestr/2704482/ "В реестре отечественного ПО №24216")
[Канал в Telegram](https://ttttt.me/Otusjava)
[Группа в Telegram](https://ttttt.me/joinchat/JMakp0NXc-L8nNneHCtx7A)
[Корпоративное обучение](https://otus.ru/b2b "Корпоративное обучение")
[Каталог курсов](https://otus.ru/lessons/ "Каталог курсов")
[Программы лояльности](https://otus.ru/about/loyalty/ "Программы лояльности")
[Каталог профессий](https://otus.ru/professions/ "Каталог профессий")
[Наши партнеры](https://otus.ru/employers/all/ "Наши партнеры")
[Стать преподавателем](https://otus.ru/teach/ "Стать преподавателем")
[О нас](https://otus.ru/about "О нас")
[СМИ о нас](https://otus.ru/smi/ "СМИ о нас")
[Отзывы](https://otus.ru/reviews "Отзывы")
[Контакты](https://otus.ru/contacts/ "Контакты")
[Блог](https://otus.ru/journal/ "Блог")
[FAQ](https://otus.ru/faq/ "FAQ")
© 2015-2026 OTUS
[Пользовательское соглашение](https://otus.ru/legal/terms/ "Пользовательское соглашение")
Премия Рунета
2018
Премия Рунета
2018
Восстановление пароля
  
 |
| Readable Markdown | Теги: python, gil, global interpreter lock, multiprocessing, fork, read-only кэш, copy-on-write, top, ps, rss, vms, reference counting, shared memory, mmap

Многие из вас знают, что в Python есть **GIL** – *Global Interpreter Lock*, тот самый, который не даёт запускать несколько потоков и нагружать ядра процессора. Отчасти это так, но за **GIL** в Python скрывается очень много всего.И вот несколько фактов о нём:
— **GIL** будет всегда. Но это не точно. — Захват **GIL** – одна из первых инструкций, которая выполняется в начале работы вашего кода. — Блокировка переключается каждые 100 инструкций байт-кода до версии 3.2. — Однако в Python до версии 3.2 у нас была возможность управлять этой цифрой. После – нет. — Всё потому, что в Python 3.2 и выше **GIL** был очень сильно переписан. Теперь блокировка переключается по времени. — Потоки соревнуются за захват **GIL**, у некоторых из них, например, тех, которые активно занимаются вводом\\выводом, это получается чаще. — До версии 3.2 есть тонкости обработки сигналов при многопоточном коде – ваш код иногда может не получить сигнал от ОС. — Планированием выполнения потоков занимается ОС, а Python только говорит ей, как ему бы хотелось. — Вы можете обойти ограничения в своём коде при помощи multiprocessing. — Или написав своё Python C Extension.
Рассмотрим один из самых очевидных способов избежать ограничений **GIL**’а при выполнении **CPU-intensive** задач.
## Модуль multiprocessing
Запускай по процессу на ядро и вперёд! К сожалению, очевидный способ не значит, что простой. Допустим, запускается процесс, который **fork**’ает дочерний процесс, но перед этим загружает в память какой-нибудь большой **read-only кэш**, необходимый этим процессам для функционирования.
Вот это класс! Казалось бы, за счёт **copy-on-write** (предполагаем Linux) оба процесса будут *видеть* один и тот же кэш, но дублировать его в памяти не придётся. В **top** (ну или **ps**) увидим, что у процессов **RSS** (*Resident Set Size*) меньше **VMS** (*Virtual Memory Size*). А если кто-то из них и решит туда записать, то ОС скопирует в его адресное пространство только нужные страницы.
## Всё так, но есть нюансы
В Python управление памятью осуществляется с помощью **reference counting**. И даже простой цикл по списку, например, вызывает увеличение счётчика ссылок находящихся в нём объектов. То есть, скорее всего, наш большой кэш не останется надолго в общей памяти, а быстро скопируется в адресные пространства процессов.
Чтобы этого избежать нужно положить кэш в **shared memory**, то есть разделяемую память, которая является общей для обоих процессов. **Multiprocessing** даёт нам такую возможность, но выбор опций достаточно скудный: можно создать одно значение или массив. Для чего-то более сложного придётся использовать **mmap**, но программировать это будет ещё сложнее.
*Есть вопрос? Напишите в комментариях\!* |
| Shard | 91 (laksa) |
| Root Hash | 10530217490906537691 |
| Unparsed URL | ru,otus!/nest/post/390/ s443 |