🕷️ Crawler Inspector

URL Lookup

Direct Parameter Lookup

Raw Queries and Responses

1. Shard Calculation

Query:
Response:
Calculated Shard: 45 (from laksa086)

2. Crawled Status Check

Query:
Response:

3. Robots.txt Check

Query:
Response:

4. Spam/Ban Check

Query:
Response:

5. Seen Status Check

ℹ️ Skipped - page is already crawled

📄
INDEXABLE
CRAWLED
3 days ago
🤖
ROBOTS ALLOWED

Page Info Filters

FilterStatusConditionDetails
HTTP statusPASSdownload_http_code = 200HTTP 200
Age cutoffPASSdownload_stamp > now() - 6 MONTH0.1 months ago
History dropPASSisNull(history_drop_reason)No drop reason
Spam/banPASSfh_dont_index != 1 AND ml_spam_score = 0ml_spam_score=0
CanonicalPASSmeta_canonical IS NULL OR = '' OR = src_unparsedNot set

Page Details

PropertyValue
URLhttps://speakerdeck.com/moscowdjango/gil-v-python-zachiem-on-nuzhien-i-kak-s-etim-zhit
Last Crawled2026-04-16 19:49:34 (3 days ago)
First Indexed2018-10-06 18:44:01 (7 years ago)
HTTP Status Code200
Meta TitleGIL в Python: зачем он нужен и как с этим жить - Speaker Deck
Meta DescriptionГригорий Петров (Digital October) В своем докладе Григорий проведет краткий экскурс в историю потоков и расскажет, зачем был создан GIL. Будут рассмо…
Meta Canonicalnull
Boilerpipe Text
Transcript Но программисты снова не смогли В процессе написания больших и сложных программ возник ряд вопросов: • Если программа читает файл, то она ждет, пока операционная система вернет управление. • Асинхронные функции и алгоритмы слишком сложны и не всегда доступны. • Запуск дополнительных процессов слишком долгий. * * Для Windows :) Поток • Это процесс без виртуализации памяти :) • Засыпает и просыпается так же, как раньше засыпали и просыпались процессы. • Читает и пишет ту же виртуальную память, что и остальные потоки одного процесса. • Быстро стартует. • При создании процесса создается первый, он же “основной” поток. И что тогда делает Lock в GIL? Если потоки и без GIL не выполняются одновременно, то как GIL может, цитируя документацию, “prevent multiple native threads from executing Python bytecodes at once (одновременно)”? А никак. Он не это делает. Как он это делает? Тривиально. Программа не может предотвратить засыпание своих потоков, но она может контролировать, когда они проснутся. Python принудительно погружает все потоки, кроме текущего, в сон. Они спят и ждут светлого будущего GIL. А когда Python понимает, что текущий поток уже слишком долго работает в гордом одиночестве, - он усыпляет его в ожидаемом месте и будит один из своих спящих потоков. Что такое тик? Это тик: a = 1 Версия 3.2 • Потоки спят и ждут GIL не вечно, а 5 мс. • Проснувшийся по таймауту поток обижается, выставляет флаг “хочу GIL” и снова засыпает. • Текущий поток в конце каждого тика проверяет наличие флага “хочу GIL” и, если таковой есть, будит один из ожидающих GIL потоков и засыпает. • sys.getswitchinterval, sys.setswitchinterval Итак, что же делает GIL? • В нормальных условиях потоки засыпают и просыпаются по велению операционной системы - часто и неожиданно. • GIL запрещает всем потокам Python, кроме текущего, просыпаться неожиданно. • Текущий поток засыпает и просыпается по велению операционной системы. Но когда Python решает, что пора переключаться, - текущий поток засыпает сам. И где же здесь проблема? ? Механизм поднятия GIL GIL защищает от того, что поток A неожиданно уснет, поток B неожиданно проснется и поменяет байтики внутри интерпретатора, которые поток А ну никак не ожидает видеть измененными. Но если в потоке вызвана функция операционной системы для приема данных по сети - это не код python, и он не может поменять байтики в интерпретаторе. Логическая защита кода threading.Lock threading.Semaphore threading.Event threading.Queue А если много ядер? • Если у вас много ядер и вы хотите максимизировать скорость выполнения именно Python кода — значит, у вас очень редкий случай :) • NumPy и SciPy поднимают GIL на долгих операциях (работа с матрицами). • Используйте библиотеки для расчетов • Используйте процессы.
Markdown
[Upgrade to Pro — share decks privately, control downloads, hide ads and more …](https://speakerdeck.com/pro?utm_campaign=upgrade_to_pro&utm_medium=web&utm_source=talk_show) [![Speaker Deck](https://d1eu30co0ohy4w.cloudfront.net/assets/mark-f4be6df1e05965cac9f98e664a6c35f5ffdd0207385d07464a9214d6cdf76082.svg) Speaker Deck](https://speakerdeck.com/) - [Features](https://speakerdeck.com/features) - [Speaker Deck PRO](https://speakerdeck.com/pro?utm_campaign=speakerdeck_pro&utm_medium=web&utm_source=nav_unauthenticated) - [Sign in](https://speakerdeck.com/signin) - [Sign up for free](https://speakerdeck.com/signup) [![Speaker Deck](https://d1eu30co0ohy4w.cloudfront.net/assets/mark-white-8d908558fe78e8efc8118c6fe9b9b1a9846b182c503bdc6902f97df4ddc9f3af.svg)](https://speakerdeck.com/) #### GIL в Python: зачем он нужен и как с этим жить [![Avatar for Moscow Python Meetup](https://secure.gravatar.com/avatar/53b0434aded1fb944ec3037c382158c1?s=47) Moscow Python Meetup](https://speakerdeck.com/moscowdjango) [PRO](https://speakerdeck.com/pro?utm_campaign=PRO&utm_medium=web&utm_source=user_pro_badge) September 12, 2013 [Programming](https://speakerdeck.com/c/programming) 5\.6k [2](https://speakerdeck.com/signin?return_to=%2Fmoscowdjango%2Fgil-v-python-zachiem-on-nuzhien-i-kak-s-etim-zhit "Star GIL в Python: зачем он нужен и как с этим жить") Share # GIL в Python: зачем он нужен и как с этим жить Григорий Петров (Digital October) В своем докладе Григорий проведет краткий экскурс в историю потоков и расскажет, зачем был создан GIL. Будут рассмотрены практические вопросы многопоточности в Python и способы работы с GIL. ![Avatar for Moscow Python Meetup](https://secure.gravatar.com/avatar/53b0434aded1fb944ec3037c382158c1?s=128) ## [Moscow Python Meetup](https://speakerdeck.com/moscowdjango) [PRO](https://speakerdeck.com/pro?utm_campaign=PRO&utm_medium=web&utm_source=user_pro_badge) September 12, 2013 ## More Decks by Moscow Python Meetup [See All by Moscow Python Meetup](https://speakerdeck.com/moscowdjango) [Moscow Python Meetup №109. Георгий Дьячков (Альфа банк, Главный разработчик). Векторные базы в агентной архитектуре и как изменятся вопросы на собеседованиях в 2026](https://speakerdeck.com/moscowdjango/moscow-python-meetup-109-gieorghii-diachkov-alfa-bank-glavnyi-razrabotchik-viektornyie-bazy-v-aghientnoi-arkhitiekturie "Moscow Python Meetup №109. Георгий Дьячков (Альфа банк, Главный разработчик). Векторные базы в агентной архитектуре и как изменятся вопросы на собеседованиях в 2026 ") [![Avatar for Moscow Python Meetup](https://secure.gravatar.com/avatar/53b0434aded1fb944ec3037c382158c1?s=24) moscowdjango](https://speakerdeck.com/moscowdjango) [PRO](https://speakerdeck.com/pro?utm_campaign=PRO&utm_medium=web&utm_source=user_pro_badge) 0 21 [Moscow Python Meetup №109. Евгений Блинов (The Mutating Company). Ближайшее будущее мутационного тестирования на Python](https://speakerdeck.com/moscowdjango/moscow-python-meetup-109-ievghienii-blinov-the-mutating-company-blizhaishieie-budushchieie-mutatsionnogho-tiestirovaniia-na-python "Moscow Python Meetup №109. Евгений Блинов (The Mutating Company). Ближайшее будущее мутационного тестирования на Python ") [![Avatar for Moscow Python Meetup](https://secure.gravatar.com/avatar/53b0434aded1fb944ec3037c382158c1?s=24) moscowdjango](https://speakerdeck.com/moscowdjango) [PRO](https://speakerdeck.com/pro?utm_campaign=PRO&utm_medium=web&utm_source=user_pro_badge) 0 21 [Moscow Python Meetup №108. Воркшоп "Построение AI-агента: Говори с данными на языке бизнеса"](https://speakerdeck.com/moscowdjango/moscow-python-meetup-108-vorkshop-postroieniie-ai-aghienta-govori-s-dannymi-na-iazykie-bizniesa "Moscow Python Meetup №108. Воркшоп \"Построение AI-агента: Говори с данными на языке бизнеса\"") [![Avatar for Moscow Python Meetup](https://secure.gravatar.com/avatar/53b0434aded1fb944ec3037c382158c1?s=24) moscowdjango](https://speakerdeck.com/moscowdjango) [PRO](https://speakerdeck.com/pro?utm_campaign=PRO&utm_medium=web&utm_source=user_pro_badge) 0 60 [Moscow Python Meetup №108. Gather. Inspire. Deliver.](https://speakerdeck.com/moscowdjango/moscow-python-meetup-108-gather-inspire-deliver "Moscow Python Meetup №108. Gather. Inspire. Deliver.") [![Avatar for Moscow Python Meetup](https://secure.gravatar.com/avatar/53b0434aded1fb944ec3037c382158c1?s=24) moscowdjango](https://speakerdeck.com/moscowdjango) [PRO](https://speakerdeck.com/pro?utm_campaign=PRO&utm_medium=web&utm_source=user_pro_badge) 0 48 [Moscow Python Meetup №107. Бесшовные релизы глазами разработчика: обновляем код Облака без API](https://speakerdeck.com/moscowdjango/moscow-python-meetup-107-biesshovnyie-rielizy-ghlazami-razrabotchika-obnovliaiem-kod-oblaka-biez-api "Moscow Python Meetup №107. Бесшовные релизы глазами разработчика: обновляем код Облака без API") [![Avatar for Moscow Python Meetup](https://secure.gravatar.com/avatar/53b0434aded1fb944ec3037c382158c1?s=24) moscowdjango](https://speakerdeck.com/moscowdjango) [PRO](https://speakerdeck.com/pro?utm_campaign=PRO&utm_medium=web&utm_source=user_pro_badge) 0 50 [Moscow Python Meetup №107. Django Blue-Green Migrations](https://speakerdeck.com/moscowdjango/moscow-python-meetup-107-django-blue-green-migrations "Moscow Python Meetup №107. Django Blue-Green Migrations") [![Avatar for Moscow Python Meetup](https://secure.gravatar.com/avatar/53b0434aded1fb944ec3037c382158c1?s=24) moscowdjango](https://speakerdeck.com/moscowdjango) [PRO](https://speakerdeck.com/pro?utm_campaign=PRO&utm_medium=web&utm_source=user_pro_badge) 0 38 [Moscow Python Meetup №107. Суперсжатые полнотекстовые индексы](https://speakerdeck.com/moscowdjango/moscow-python-meetup-107-supierszhatyie-polnotiekstovyie-indieksy "Moscow Python Meetup №107. Суперсжатые полнотекстовые индексы") [![Avatar for Moscow Python Meetup](https://secure.gravatar.com/avatar/53b0434aded1fb944ec3037c382158c1?s=24) moscowdjango](https://speakerdeck.com/moscowdjango) [PRO](https://speakerdeck.com/pro?utm_campaign=PRO&utm_medium=web&utm_source=user_pro_badge) 0 61 [Moscow Python Meetup №106. Евгений Блинов (The Mutating Company, Founder). Суперфункции](https://speakerdeck.com/moscowdjango/moscow-python-meetup-106-ievghienii-blinov "Moscow Python Meetup №106. Евгений Блинов (The Mutating Company, Founder). Суперфункции") [![Avatar for Moscow Python Meetup](https://secure.gravatar.com/avatar/53b0434aded1fb944ec3037c382158c1?s=24) moscowdjango](https://speakerdeck.com/moscowdjango) [PRO](https://speakerdeck.com/pro?utm_campaign=PRO&utm_medium=web&utm_source=user_pro_badge) 0 110 [Moscow Python Meetup №106. Валерий Карпузов (SmartFX, Team Lead). Пиши, сокращай — Code Golf на Python](https://speakerdeck.com/moscowdjango/moscow-python-meetup-106-valierii-karpuzov-smartfx-team-lead "Moscow Python Meetup №106. Валерий Карпузов (SmartFX, Team Lead). Пиши, сокращай — Code Golf на Python ") [![Avatar for Moscow Python Meetup](https://secure.gravatar.com/avatar/53b0434aded1fb944ec3037c382158c1?s=24) moscowdjango](https://speakerdeck.com/moscowdjango) [PRO](https://speakerdeck.com/pro?utm_campaign=PRO&utm_medium=web&utm_source=user_pro_badge) 0 130 ## Other Decks in Programming [See All in Programming](https://speakerdeck.com/c/programming) [我々はなぜ「層」を分けるのか〜「関心の分離」と「抽象化」で手に入れる変更に強いシンプルな設計〜 \#phperkaigi / PHPerKaigi 2026](https://speakerdeck.com/shogogg/phperkaigi-2026 "我々はなぜ「層」を分けるのか〜「関心の分離」と「抽象化」で手に入れる変更に強いシンプルな設計〜 #phperkaigi / PHPerKaigi 2026") [![Avatar for shogogg](https://secure.gravatar.com/avatar/9a2adffb9e407536ca78fc31ba3f90ad?s=24) shogogg](https://speakerdeck.com/shogogg) 2 830 [Go\_College\_最終発表資料\_\_外部公開用\_.pdf](https://speakerdeck.com/xe_pc23/go-college-zui-zhong-fa-biao-zi-liao-wai-bu-gong-kai-yong "Go_College_最終発表資料__外部公開用_.pdf") [![Avatar for xe-pc23](https://speakerdeck.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6NjUzNDU3LCJwdXIiOiJibG9iX2lkIn19--1c9af8f09269b18d375b6c95369fa4d05fc0f8a2/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJKUEVHIiwicmVzaXplX3RvX2ZpbGwiOlsyNCwyNF19LCJwdXIiOiJ2YXJpYXRpb24ifX0=--d3daf4d24a4675828d235f487205a91d27095c5f/mainiconprofile.JPEG) xe\_pc23](https://speakerdeck.com/xe_pc23) 0 130 [Linux Kernelの1文字のミスで 権限昇格ができた話](https://speakerdeck.com/rqda/linux-kernelno1wen-zi-nomisude-quan-xian-sheng-ge-gadekitahua "Linux Kernelの1文字のミスで 権限昇格ができた話") [![Avatar for rona](https://secure.gravatar.com/avatar/0c0d9398d1208658ca699482243e0668?s=24) rqda](https://speakerdeck.com/rqda) 0 2\.3k [GNU Makeの使い方 / How to use GNU Make](https://speakerdeck.com/kaityo256/how-to-use-gnu-make "GNU Makeの使い方 / How to use GNU Make") [![Avatar for kaityo256](https://secure.gravatar.com/avatar/a10e41b0a61d59f2258d7f6172c33479?s=24) kaityo256](https://speakerdeck.com/kaityo256) [PRO](https://speakerdeck.com/pro?utm_campaign=PRO&utm_medium=web&utm_source=user_pro_badge) 16 5\.6k [Redox OS でのネームスペース管理と chroot の実現](https://speakerdeck.com/isanethen/redox-os-denonemusupesuguan-li-to-chroot-noshi-xian "Redox OS でのネームスペース管理と chroot の実現") [![Avatar for isan](https://secure.gravatar.com/avatar/f1fd6469638c15a0a3ca441deab0c11e?s=24) isanethen](https://speakerdeck.com/isanethen) 0 550 [実践CRDT](https://speakerdeck.com/tamadeveloper/shi-jian-crdt "実践CRDT") [![Avatar for tamadeveloper](https://secure.gravatar.com/avatar/8bb506d524519c7e773e1eb2d4d4dd6d?s=24) tamadeveloper](https://speakerdeck.com/tamadeveloper) 0 370 [\[PHPerKaigi 2026\]PHPerKaigi2025の企画CodeGolfが最高すぎて社内で内製して半年運営して得た内製と運営の知見](https://speakerdeck.com/ikezoemakoto/phperkaigi-2026-phperkaigi2025noqi-hua-codegolfgazui-gao-sugiteshe-nei-denei-zhi-siteban-nian-yun-ying-sitede-tanei-zhi-toyun-ying-nozhi-jian "[PHPerKaigi 2026]PHPerKaigi2025の企画CodeGolfが最高すぎて社内で内製して半年運営して得た内製と運営の知見") [![Avatar for Z.O.E.](https://secure.gravatar.com/avatar/83346358e135f79176e4e5d4fbbd850c?s=24) ikezoemakoto](https://speakerdeck.com/ikezoemakoto) 0 340 [PHPで TLSのプロトコルを実装してみるをもう一度しゃべりたい](https://speakerdeck.com/higaki_program/phpde-tlsnopurotokoruwoshi-zhuang-sitemiruwomou-du-siyaberitai "PHPで TLSのプロトコルを実装してみるをもう一度しゃべりたい") [![Avatar for higaki](https://speakerdeck.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MzQzMDQ0LCJwdXIiOiJibG9iX2lkIn19--dbc4195998381a11c60f198a26a5d1eb466b67e8/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJqcGciLCJyZXNpemVfdG9fZmlsbCI6WzI0LDI0XX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--dcc78b2290da0fc746e1bfe817edcd08056147b6/DSC02156_Original.jpg) higaki\_program](https://speakerdeck.com/higaki_program) 0 180 [Offline should be the norm: building local-first apps with CRDTs & Kotlin Multiplatform](https://speakerdeck.com/renaudmathieu/offline-should-be-the-norm-building-local-first-apps-with-crdts-and-kotlin-multiplatform "Offline should be the norm: building local-first apps with CRDTs & Kotlin Multiplatform") [![Avatar for Renaud MATHIEU](https://secure.gravatar.com/avatar/65f7385b8bb2bcd85909059b532573a3?s=24) renaudmathieu](https://speakerdeck.com/renaudmathieu) 0 140 [メッセージングを利用して時間的結合を分離しよう \#phperkaigi](https://speakerdeck.com/kajitack/messaging-temporal-coupling "メッセージングを利用して時間的結合を分離しよう #phperkaigi") [![Avatar for Takuma Kajikawa](https://speakerdeck.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6NzMzNzksInB1ciI6ImJsb2JfaWQifX0=--3297fc083c0705752737604af3f37153935ef380/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fZmlsbCI6WzI0LDI0XX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--924ecf2834d46e1be7416cc0ef8ce19d4bbdebbf/horsepng8.png) kajitack](https://speakerdeck.com/kajitack) 3 560 [車輪の再発明をしよう!PHP で実装して学ぶ、Web サーバーの仕組みと HTTP の正体](https://speakerdeck.com/h1r0/che-lun-nozai-fa-ming-wosiyou-php-deshi-zhuang-sitexue-bu-web-sabanoshi-zu-mito-http-nozheng-ti "車輪の再発明をしよう!PHP で実装して学ぶ、Web サーバーの仕組みと HTTP の正体") [![Avatar for H1R0](https://speakerdeck.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6OTkzNzAsInB1ciI6ImJsb2JfaWQifX0=--11c52b9b0fb851f9c9820d7cd60278412a3845a3/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fZmlsbCI6WzI0LDI0XX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--924ecf2834d46e1be7416cc0ef8ce19d4bbdebbf/user-icon.png) h1r0](https://speakerdeck.com/h1r0) 3 510 [AI活用のコスパを最大化する方法](https://speakerdeck.com/ochtum/aihuo-yong-nokosupawozui-da-hua-surufang-fa-1e025d1d-c424-4303-872f-3b10985a562a "AI活用のコスパを最大化する方法") [![Avatar for Ochtum](https://speakerdeck.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MjYxNjkyLCJwdXIiOiJibG9iX2lkIn19--d2f6102ede7c253ade52de0ce9712dab57d2210a/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fZmlsbCI6WzI0LDI0XX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--924ecf2834d46e1be7416cc0ef8ce19d4bbdebbf/ochtum.png) ochtum](https://speakerdeck.com/ochtum) 0 380 ## Featured [See All Featured](https://speakerdeck.com/p/featured) [Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024](https://speakerdeck.com/apolaine/navigating-the-design-leadership-dip-product-design-week-design-leaders-plus-conference-2024 "Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024") [![Avatar for Andy Polaine](https://secure.gravatar.com/avatar/0f6ccdd935ce93750fcc527764c7abfc?s=24) apolaine](https://speakerdeck.com/apolaine) 0 260 [HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy](https://speakerdeck.com/inesmontani/hu-berlin-industrial-strength-natural-language-processing-with-spacy-and-prodigy "HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy") [![Avatar for Ines Montani](https://speakerdeck.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MjkwMDgsInB1ciI6ImJsb2JfaWQifX0=--32562a32b00d456c251338e2bbab3b3a7c1775bf/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJqcGciLCJyZXNpemVfdG9fZmlsbCI6WzI0LDI0XX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--dcc78b2290da0fc746e1bfe817edcd08056147b6/profile_ines.jpg) inesmontani](https://speakerdeck.com/inesmontani) [PRO](https://speakerdeck.com/pro?utm_campaign=PRO&utm_medium=web&utm_source=user_pro_badge) 0 310 [ラッコキーワード サービス紹介資料](https://speakerdeck.com/rakko/introduction "ラッコキーワード サービス紹介資料") [![Avatar for ラッコ株式会社](https://speakerdeck.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MjAwMTgyLCJwdXIiOiJibG9iX2lkIn19--1a675f702fe37e192521a48d72064c54472362d5/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fZmlsbCI6WzI0LDI0XX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--924ecf2834d46e1be7416cc0ef8ce19d4bbdebbf/logo.rakkoinc_600x600.png) rakko](https://speakerdeck.com/rakko) 1 2\.9M [Building a Modern Day E-commerce SEO Strategy](https://speakerdeck.com/aleyda/building-a-modern-day-e-commerce-seo-strategy "Building a Modern Day 
E-commerce SEO Strategy") [![Avatar for Aleyda Solis](https://speakerdeck.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6OTIyMDAsInB1ciI6ImJsb2JfaWQifX0=--f7ae7c6a9c16b0bb4461d98502be71c2c1b38eaf/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJqcGciLCJyZXNpemVfdG9fZmlsbCI6WzI0LDI0XX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--dcc78b2290da0fc746e1bfe817edcd08056147b6/aleyda-solis.jpg) aleyda](https://speakerdeck.com/aleyda) 45 9k [Documentation Writing (for coders)](https://speakerdeck.com/carmenintech/documentation-writing-for-coders "Documentation Writing (for coders)") [![Avatar for Carmen Chung](https://secure.gravatar.com/avatar/61857dafbd287b3027c4dcea9008ad3c?s=24) carmenintech](https://speakerdeck.com/carmenintech) 77 5\.3k [Money Talks: Using Revenue to Get Sh\*t Done](https://speakerdeck.com/nikkihalliwell/money-talks-using-revenue-to-get-sh-star-t-done "Money Talks: Using Revenue to Get Sh*t Done") [![Avatar for Nikki Halliwell](https://speakerdeck.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTAzMzQ0LCJwdXIiOiJibG9iX2lkIn19--1678adea55124016b7aa2f244a6c271a20d449f8/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJqcGciLCJyZXNpemVfdG9fZmlsbCI6WzI0LDI0XX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--dcc78b2290da0fc746e1bfe817edcd08056147b6/Nikki-PIC-2%20compressed.jpg) nikkihalliwell](https://speakerdeck.com/nikkihalliwell) 0 200 [Sam Torres - BigQuery for SEOs](https://speakerdeck.com/techseoconnect/sam-torres-bigquery-for-seos "Sam Torres - BigQuery for SEOs") [![Avatar for Tech SEO Connect](https://speakerdeck.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTQ2NjU4LCJwdXIiOiJibG9iX2lkIn19--14f297c27d2190051dc109b5d472cf0297dd6c3e/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fZmlsbCI6WzI0LDI0XX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--924ecf2834d46e1be7416cc0ef8ce19d4bbdebbf/40575_logo_social%20media%20profile%204.png) techseoconnect](https://speakerdeck.com/techseoconnect) [PRO](https://speakerdeck.com/pro?utm_campaign=PRO&utm_medium=web&utm_source=user_pro_badge) 0 240 [Chasing Engaging Ingredients in Design](https://speakerdeck.com/codingconduct/chasing-engaging-ingredients-in-design "Chasing Engaging Ingredients in Design") [![Avatar for Sebastian Deterding](https://secure.gravatar.com/avatar/9f5f8d89c1c298beb2e5d3b1e41941e2?s=24) codingconduct](https://speakerdeck.com/codingconduct) 0 160 [Being A Developer After 40](https://speakerdeck.com/akosma/being-a-developer-after-40 "Being A Developer After 40") [![Avatar for Adrian Kosmaczewski](https://secure.gravatar.com/avatar/88dd97cf2dc7f06cc51a01d450f0b1e5?s=24) akosma](https://speakerdeck.com/akosma) 91 590k [Google's AI Overviews - The New Search](https://speakerdeck.com/badams/googles-ai-overviews-the-new-search "Google's AI Overviews - The New Search") [![Avatar for Barry Adams](https://secure.gravatar.com/avatar/00de107acb085244c96dbfe6da2b1560?s=24) badams](https://speakerdeck.com/badams) 0 960 [Applied NLP in the Age of Generative AI](https://speakerdeck.com/inesmontani/applied-nlp-in-the-age-of-generative-ai "Applied NLP in the Age of Generative AI") [![Avatar for Ines Montani](https://speakerdeck.com/rails/active_storage/representations/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MjkwMDgsInB1ciI6ImJsb2JfaWQifX0=--32562a32b00d456c251338e2bbab3b3a7c1775bf/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJqcGciLCJyZXNpemVfdG9fZmlsbCI6WzI0LDI0XX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--dcc78b2290da0fc746e1bfe817edcd08056147b6/profile_ines.jpg) inesmontani](https://speakerdeck.com/inesmontani) [PRO](https://speakerdeck.com/pro?utm_campaign=PRO&utm_medium=web&utm_source=user_pro_badge) 4 2\.2k [Music & Morning Musume](https://speakerdeck.com/bryan/music-morning-musume "Music & Morning Musume") [![Avatar for Bryan Veloso](https://secure.gravatar.com/avatar/a60068bce2e73de3a37ca9d2dbe36092?s=24) bryan](https://speakerdeck.com/bryan) 47 7\.1k ## Transcript 1. ### [GIL в Python зачем он нужен и как с этим](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_0.jpg "GIL в Python: зачем он нужен и как с этим жить GIL в Python зачем он нужен и как с этим жить") жить 2. ### [Что сейчас будет? Время 30-40 минут Ведущий Григорий Петров Специализация](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_1.jpg "GIL в Python: зачем он нужен и как с этим жить Что сейчас будет? Время 30-40 минут Ведущий Гри...") Руководство разработкой Опыт Более 15 лет Вопросы В конце доклада 3. ### [Warning В докладе много упрощений и допущений, особенно это касается](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_2.jpg "GIL в Python: зачем он нужен и как с этим жить Warning В докладе много упрощений и допущений, ...") многопроцессорных систем. Точность принесена в жертву простоте изложения, чтобы не превратить обзорный доклад с плюшками в сухую и бесполезную лекцию. 4. ### [Упрощение до предела У компьютера есть память и процессор. Все](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_3.jpg "GIL в Python: зачем он нужен и как с этим жить Упрощение до предела У компьютера есть память и...") что компьютер делает, - это берет байтики из памяти, грустно на них смотрит и меняет на другие байтики в памяти. И все. 5. ### [Первые шаги Первые компьютеры и первые операционные системы были очень](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_4.jpg "GIL в Python: зачем он нужен и как с этим жить Первые шаги Первые компьютеры и первые операцио...") простые: они выполняли только одну программу за раз. Все программы загружались в общую память и передавали друг другу управление – кооперативная многозадачность. 6. ### [И первые хотелки Пользователи хотели выполнять несколько программ одновременно. И](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_5.jpg "GIL в Python: зачем он нужен и как с этим жить И первые хотелки Пользователи хотели выполнять ...") программисты создали абстракцию - процесс. С кооперативной многозадачностью. Все программы загружались в общую память и передавали друг другу управление. 7. ### [Но программисты не смогли Программисты не смогли писать программы без](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_6.jpg "GIL в Python: зачем он нужен и как с этим жить Но программисты не смогли Программисты не смогл...") ошибок - слишком дорого. И когда программа зависала, она не передавала никому управление, и зависали все запущенные программы во главе с операционной системой. … А еще программы портили память. Надо было что-то делать. 8. ### [Вытесняющая многозадачность Раз в 20 миллисекунд процесс засыпает, и просыпается](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_7.jpg "GIL в Python: зачем он нужен и как с этим жить Вытесняющая многозадачность Раз в 20 миллисекун...") мафия операционная система, которая обозревает спящие процессы и решает, кому из них просыпаться. Зависшие процессы больше не останавливают операционную систему. Правильно написанная программа большую часть времени спит, ожидая чего-нибудь интересного. Ее разбудят. 9. ### [Виртуальная память В CPU была добавлена функция обмана программ. Каждая](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_8.jpg "GIL в Python: зачем он нужен и как с этим жить Виртуальная память В CPU была добавлена функция...") программа считает, что у нее есть вся память от 0 до бесконечности\*. А при записи и чтении соответствующий кусочек памяти записывается и читается в физическую память. \* Для 32-битных систем бесконечность - от 2 до 3 гигабайт, в зависимости от настроек. 10. ### [Но программисты снова не смогли В процессе написания больших и](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_9.jpg "GIL в Python: зачем он нужен и как с этим жить Но программисты снова не смогли В процессе напи...") сложных программ возник ряд вопросов: • Если программа читает файл, то она ждет, пока операционная система вернет управление. • Асинхронные функции и алгоритмы слишком сложны и не всегда доступны. • Запуск дополнительных процессов слишком долгий. \* \* Для Windows :) 11. ### [Поток • Это процесс без виртуализации памяти :) • Засыпает](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_10.jpg "GIL в Python: зачем он нужен и как с этим жить Поток ● Это процесс без виртуализации памяти :)...") и просыпается так же, как раньше засыпали и просыпались процессы. • Читает и пишет ту же виртуальную память, что и остальные потоки одного процесса. • Быстро стартует. • При создании процесса создается первый, он же “основной” поток. 12. ### [Но программисты снова не смогли Вам рассказывали, что проблема многопоточности](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_11.jpg "GIL в Python: зачем он нужен и как с этим жить Но программисты снова не смогли Вам рассказывал...") \- в одновременном доступе к памяти? Вас обманули. Компьютер ничего не делает “одновременно” - он играет в пошаговую стратегию. \* • Проблема потоков в том, что они засыпают и просыпаются в неожиданные моменты времени. \* Многоядерные играют в несколько непересекающихся пошаговых стратегий. 13. ### [Совсем неожиданные Память Поток 2 Поток 1 Поток работает Поток](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_12.jpg "GIL в Python: зачем он нужен и как с этим жить Совсем неожиданные Память Поток 2 Поток 1 Поток...") работает Поток работает Поток спит Поток спит Поток спит Общая память потоков Общая память потоков Общая память потоков Указатель не 0? Читаем по адресу Обнулить :) Указатель → адрес Указатель → 0 Указатель → 0 14. ### [И что тогда делает Lock в GIL? Если потоки и](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_13.jpg "GIL в Python: зачем он нужен и как с этим жить И что тогда делает Lock в GIL? Если потоки и бе...") без GIL не выполняются одновременно, то как GIL может, цитируя документацию, “prevent multiple native threads from executing Python bytecodes at once (одновременно)”? 15. ### [И что тогда делает Lock в GIL? Если потоки и](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_14.jpg "GIL в Python: зачем он нужен и как с этим жить И что тогда делает Lock в GIL? Если потоки и бе...") без GIL не выполняются одновременно, то как GIL может, цитируя документацию, “prevent multiple native threads from executing Python bytecodes at once (одновременно)”? А никак. Он не это делает. 16. ### [От чего защищает GIL? От того, что второй поток проснется](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_15.jpg "GIL в Python: зачем он нужен и как с этим жить От чего защищает GIL? От того, что второй поток...") неожиданно для первого и поменяет структуры в памяти интерпретатора. Проснувшийся первый поток будет очень удивлен. Вплоть до падения. 17. ### [Как он это делает? Тривиально. Программа не может предотвратить засыпание](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_16.jpg "GIL в Python: зачем он нужен и как с этим жить Как он это делает? Тривиально. Программа не мож...") своих потоков, но она может контролировать, когда они проснутся. Python принудительно погружает все потоки, кроме текущего, в сон. Они спят и ждут светлого будущего. 18. ### [Как он это делает? Тривиально. Программа не может предотвратить засыпание](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_17.jpg "GIL в Python: зачем он нужен и как с этим жить Как он это делает? Тривиально. Программа не мож...") своих потоков, но она может контролировать, когда они проснутся. Python принудительно погружает все потоки, кроме текущего, в сон. Они спят и ждут светлого будущего GIL. 19. ### [Как он это делает? Тривиально. Программа не может предотвратить засыпание](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_18.jpg "GIL в Python: зачем он нужен и как с этим жить Как он это делает? Тривиально. Программа не мож...") своих потоков, но она может контролировать, когда они проснутся. Python принудительно погружает все потоки, кроме текущего, в сон. Они спят и ждут светлого будущего GIL. А когда Python понимает, что текущий поток уже слишком долго работает в гордом одиночестве, - он усыпляет его в ожидаемом месте и будит один из своих спящих потоков. 20. ### [И как ему это удается? Операционная система усыпляет и будит](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_19.jpg "GIL в Python: зачем он нужен и как с этим жить И как ему это удается? Операционная система усы...") потоки неожиданно, и ей нет дела до того, что Python хочет свой текущий поток усыпить в ожидаемое время. Что же делать? 21. ### [И как ему это удается? Операционная система усыпляет и будит](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_20.jpg "GIL в Python: зачем он нужен и как с этим жить И как ему это удается? Операционная система усы...") потоки неожиданно, и ей нет дела до того, что Python хочет свой текущий поток усыпить в ожидаемое время. Что же делать? Нужно интегрироваться в операционную систему и поменять логику, по которой она усыпляет и будит потоки\! 22. ### [И как ему это удается? Операционная система усыпляет и будит](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_21.jpg "GIL в Python: зачем он нужен и как с этим жить И как ему это удается? Операционная система усы...") потоки неожиданно, и ей нет дела до того, что Python хочет свой текущий поток усыпить в ожидаемое время. Что же делать? Нужно интегрироваться в операционную систему и поменять логику, по которой она усыпляет и будит потоки! Плохая идея. 23. ### [И как ему это удается? Операционная система усыпляет и будит](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_22.jpg "GIL в Python: зачем он нужен и как с этим жить И как ему это удается? Операционная система усы...") потоки неожиданно, и ей нет дела до того, что Python хочет свой текущий поток усыпить в ожидаемое время. Что же делать? Нужно, чтобы текущий поток уснул сам. В ожидаемое время. 24. ### [Когда можно засыпать? • Нельзя, чтобы другой поток проснулся, когда](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_23.jpg "GIL в Python: зачем он нужен и как с этим жить Когда можно засыпать? ● Нельзя, чтобы другой по...") мы находимся внутри C-кода интерпретатора. • Автор Python решил, что текущий поток будет засыпать раз в 100 тиков, где тик примерно соответствует одной инструкции интерпретатора. • sys.getcheckinterval, sys.setcheckinterval 25. ### [Что такое тик? Это тик: a = 1](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_24.jpg "GIL в Python: зачем он нужен и как с этим жить Что такое тик? Это тик: a = 1") 26. ### [Что такое тик? Это тик: a = 1 К сожалению,](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_25.jpg "GIL в Python: зачем он нужен и как с этим жить Что такое тик? Это тик: a = 1 К сожалению, это ...") это тоже тик: a in xrange( 10 \*\* 8 ) 27. ### [Что такое тик? Это тик: a = 1 К сожалению,](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_26.jpg "GIL в Python: зачем он нужен и как с этим жить Что такое тик? Это тик: a = 1 К сожалению, это ...") это тоже тик: a in xrange( 10 \*\* 8 ) 100 таких “тиков” выполняются минуты 28. ### [Версия 3.2 • Потоки спят и ждут GIL не вечно,](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_27.jpg "GIL в Python: зачем он нужен и как с этим жить Версия 3.2 ● Потоки спят и ждут GIL не вечно, а...") а 5 мс. • Проснувшийся по таймауту поток обижается, выставляет флаг “хочу GIL” и снова засыпает. • Текущий поток в конце каждого тика проверяет наличие флага “хочу GIL” и, если таковой есть, будит один из ожидающих GIL потоков и засыпает. • sys.getswitchinterval, sys.setswitchinterval 29. ### [Итак, что же делает GIL? • В нормальных условиях потоки](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_28.jpg "GIL в Python: зачем он нужен и как с этим жить Итак, что же делает GIL? ● В нормальных условия...") засыпают и просыпаются по велению операционной системы - часто и неожиданно. • GIL запрещает всем потокам Python, кроме текущего, просыпаться неожиданно. • Текущий поток засыпает и просыпается по велению операционной системы. Но когда Python решает, что пора переключаться, - текущий поток засыпает сам. 30. ### [И где же здесь проблема? ?](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_29.jpg "GIL в Python: зачем он нужен и как с этим жить И где же здесь проблема? ?") 31. ### [И где же здесь проблема? Мы запустили 10 потоков на](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_30.jpg "GIL в Python: зачем он нужен и как с этим жить И где же здесь проблема? Мы запустили 10 потоко...") скачивание файлов. Они не смогут просыпаться часто в случайный момент времени и будут качать с той же скоростью, как если бы были запущены последовательно? 32. ### [И где же здесь проблема? Мы запустили 10 потоков на](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_31.jpg "GIL в Python: зачем он нужен и как с этим жить И где же здесь проблема? Мы запустили 10 потоко...") скачивание файлов. Они не смогут просыпаться часто в случайный момент времени и будут качать с той же скоростью, как если бы были запущены последовательно? А вот и нет. В Python все предусмотрено. 33. ### [Механизм поднятия GIL GIL защищает от того, что поток A](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_32.jpg "GIL в Python: зачем он нужен и как с этим жить Механизм поднятия GIL GIL защищает от того, что...") неожиданно уснет, поток B неожиданно проснется и поменяет байтики внутри интерпретатора, которые поток А ну никак не ожидает видеть измененными. Но если в потоке вызвана функция операционной системы для приема данных по сети - это не код python, и он не может поменять байтики в интерпретаторе. 34. ### [Механизм поднятия GIL Когда Python вызывает функцию операционной системы или](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_33.jpg "GIL в Python: зачем он нужен и как с этим жить Механизм поднятия GIL Когда Python вызывает фун...") внешней библиотеки, он отключает механизм GIL. 35. ### [Механизм поднятия GIL Когда Python вызывает функцию операционной системы или](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_34.jpg "GIL в Python: зачем он нужен и как с этим жить Механизм поднятия GIL Когда Python вызывает фун...") внешней библиотеки, он отключает механизм GIL. А после того как функция вернет управление, снова включает его. Это называется “поднять GIL” и “опустить GIL”. 36. ### [Промежуточный вывод Если у нас одноядерный процессор, GIL ничем не](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_35.jpg "GIL в Python: зачем он нужен и как с этим жить Промежуточный вывод Если у нас одноядерный проц...") мешает нашим потокам и приносит пользу: • Код, не имеющий отношения к интерпретатору, засыпает и просыпается, когда ему надо, и не ждет ничего лишнего. • Python-код засыпает и просыпается аккуратно, чтобы ничего не повредилось. 37. ### [Физическая и логическая защита GIL защищает память от повреждений и](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_36.jpg "GIL в Python: зачем он нужен и как с этим жить Физическая и логическая защита GIL защищает пам...") делает тики атомарными. Но тики — довольно мелкая единица языка: if a \> 0: a = 10 Здесь от двух тиков и более. 38. ### [Логическая защита кода threading.Lock threading.Semaphore threading.Event threading.Queue](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_37.jpg "GIL в Python: зачем он нужен и как с этим жить Логическая защита кода threading.Lock threading...") 39. ### [А если много ядер? • Если у вас много ядер](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_38.jpg "GIL в Python: зачем он нужен и как с этим жить А если много ядер? ● Если у вас много ядер и вы...") и вы хотите максимизировать скорость выполнения именно Python кода — значит, у вас очень редкий случай :) • NumPy и SciPy поднимают GIL на долгих операциях (работа с матрицами). • Используйте библиотеки для расчетов • Используйте процессы. 40. ### [Можно кидать помидоры Рассказывал, показывал и махал руками Григорий Петров.](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_39.jpg "GIL в Python: зачем он нужен и как с этим жить Можно кидать помидоры Рассказывал, показывал и ...") Со мной можно связаться: [\[email protected\]](https://speakerdeck.com/cdn-cgi/l/email-protection) www.facebook.com/grigoryvp Вопросы? ![](https://d1eu30co0ohy4w.cloudfront.net/assets/mark-f4be6df1e05965cac9f98e664a6c35f5ffdd0207385d07464a9214d6cdf76082.svg) [![Speaker Deck](https://d1eu30co0ohy4w.cloudfront.net/assets/mark-f4be6df1e05965cac9f98e664a6c35f5ffdd0207385d07464a9214d6cdf76082.svg) SpeakerDeck](https://speakerdeck.com/) ## Top Categories - [Programming](https://speakerdeck.com/c/programming) - [Technology](https://speakerdeck.com/c/technology) - [Storyboards](https://speakerdeck.com/c/storyboards) - [Featured decks](https://speakerdeck.com/p/featured) - [Featured speakers](https://speakerdeck.com/s/featured) ## Use Cases - [Storyboard Artists](https://speakerdeck.com/pro/storyboard-artists) - [Educators](https://speakerdeck.com/educators) - [Students](https://speakerdeck.com/student-pricing) ## Resources - [Help Center](https://help.speakerdeck.com/) - [Blog](https://blog.speakerdeck.com/) - [Compare Speaker Deck](https://speakerdeck.com/slideshare-alternative) - [Advertising](https://speakerdeck.com/advertising) ## Features - [Private URLs](https://speakerdeck.com/features/privacy-controls) - [Password Protection](https://speakerdeck.com/features/password-protection) - [Custom URLS](https://speakerdeck.com/features/custom-urls) - [Scheduled publishing](https://speakerdeck.com/features/scheduled-publishing) - [Remove Branding](https://speakerdeck.com/features/remove-branding) - [Restrict embedding](https://speakerdeck.com/features/restrict-embedding) - [Notes](https://speakerdeck.com/features/slide-notes) Copyright © 2026 Speaker Deck, LLC. All slide content and descriptions are owned by their creators. - [About](https://speakerdeck.com/about) - [Terms](https://speakerdeck.com/tos) - [Privacy](https://speakerdeck.com/privacy) - [DMCA](https://speakerdeck.com/dmca) - [Accessibility Statement](https://speakerdeck.com/accessibility) ![](https://www.facebook.com/tr?id=2893765844191276&ev=PageView&noscript=1)
Readable Markdown
## Transcript 1. ### [Но программисты снова не смогли В процессе написания больших и](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_9.jpg "GIL в Python: зачем он нужен и как с этим жить Но программисты снова не смогли В процессе напи...") сложных программ возник ряд вопросов: • Если программа читает файл, то она ждет, пока операционная система вернет управление. • Асинхронные функции и алгоритмы слишком сложны и не всегда доступны. • Запуск дополнительных процессов слишком долгий. \* \* Для Windows :) 2. ### [Поток • Это процесс без виртуализации памяти :) • Засыпает](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_10.jpg "GIL в Python: зачем он нужен и как с этим жить Поток ● Это процесс без виртуализации памяти :)...") и просыпается так же, как раньше засыпали и просыпались процессы. • Читает и пишет ту же виртуальную память, что и остальные потоки одного процесса. • Быстро стартует. • При создании процесса создается первый, он же “основной” поток. 3. ### [И что тогда делает Lock в GIL? Если потоки и](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_14.jpg "GIL в Python: зачем он нужен и как с этим жить И что тогда делает Lock в GIL? Если потоки и бе...") без GIL не выполняются одновременно, то как GIL может, цитируя документацию, “prevent multiple native threads from executing Python bytecodes at once (одновременно)”? А никак. Он не это делает. 4. ### [Как он это делает? Тривиально. Программа не может предотвратить засыпание](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_18.jpg "GIL в Python: зачем он нужен и как с этим жить Как он это делает? Тривиально. Программа не мож...") своих потоков, но она может контролировать, когда они проснутся. Python принудительно погружает все потоки, кроме текущего, в сон. Они спят и ждут светлого будущего GIL. А когда Python понимает, что текущий поток уже слишком долго работает в гордом одиночестве, - он усыпляет его в ожидаемом месте и будит один из своих спящих потоков. 5. [Что такое тик? Это тик: a = 1](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_24.jpg "GIL в Python: зачем он нужен и как с этим жить Что такое тик? Это тик: a = 1") 6. ### [Версия 3.2 • Потоки спят и ждут GIL не вечно,](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_27.jpg "GIL в Python: зачем он нужен и как с этим жить Версия 3.2 ● Потоки спят и ждут GIL не вечно, а...") а 5 мс. • Проснувшийся по таймауту поток обижается, выставляет флаг “хочу GIL” и снова засыпает. • Текущий поток в конце каждого тика проверяет наличие флага “хочу GIL” и, если таковой есть, будит один из ожидающих GIL потоков и засыпает. • sys.getswitchinterval, sys.setswitchinterval 7. ### [Итак, что же делает GIL? • В нормальных условиях потоки](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_28.jpg "GIL в Python: зачем он нужен и как с этим жить Итак, что же делает GIL? ● В нормальных условия...") засыпают и просыпаются по велению операционной системы - часто и неожиданно. • GIL запрещает всем потокам Python, кроме текущего, просыпаться неожиданно. • Текущий поток засыпает и просыпается по велению операционной системы. Но когда Python решает, что пора переключаться, - текущий поток засыпает сам. 8. [И где же здесь проблема? ?](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_29.jpg "GIL в Python: зачем он нужен и как с этим жить И где же здесь проблема? ?") 9. ### [Механизм поднятия GIL GIL защищает от того, что поток A](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_32.jpg "GIL в Python: зачем он нужен и как с этим жить Механизм поднятия GIL GIL защищает от того, что...") неожиданно уснет, поток B неожиданно проснется и поменяет байтики внутри интерпретатора, которые поток А ну никак не ожидает видеть измененными. Но если в потоке вызвана функция операционной системы для приема данных по сети - это не код python, и он не может поменять байтики в интерпретаторе. 10. [Логическая защита кода threading.Lock threading.Semaphore threading.Event threading.Queue](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_37.jpg "GIL в Python: зачем он нужен и как с этим жить Логическая защита кода threading.Lock threading...") 11. ### [А если много ядер? • Если у вас много ядер](https://files.speakerdeck.com/presentations/a655d9f00cfb01310c903a30d744b908/slide_38.jpg "GIL в Python: зачем он нужен и как с этим жить А если много ядер? ● Если у вас много ядер и вы...") и вы хотите максимизировать скорость выполнения именно Python кода — значит, у вас очень редкий случай :) • NumPy и SciPy поднимают GIL на долгих операциях (работа с матрицами). • Используйте библиотеки для расчетов • Используйте процессы.
Shard45 (laksa)
Root Hash11081820283974128245
Unparsed URLcom,speakerdeck!/moscowdjango/gil-v-python-zachiem-on-nuzhien-i-kak-s-etim-zhit s443