πŸ•·οΈ Crawler Inspector

URL Lookup

Direct Parameter Lookup

Raw Queries and Responses

1. Shard Calculation

Query:
Response:
Calculated Shard: 134 (from laksa021)

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
10 days ago
πŸ€–
ROBOTS ALLOWED

Page Info Filters

FilterStatusConditionDetails
HTTP statusPASSdownload_http_code = 200HTTP 200
Age cutoffPASSdownload_stamp > now() - 6 MONTH0.4 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://habr.com/ru/companies/otus/articles/769448/
Last Crawled2026-04-09 10:26:26 (10 days ago)
First Indexed2023-10-24 11:27:25 (2 years ago)
HTTP Status Code200
Meta TitleКак устроСн GIL (Global Interpreter Lock) Π² Python: влияниС Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ / Π₯Π°Π±Ρ€
Meta DescriptionΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΡƒΠ²Π°ΠΆΠ°Π΅ΠΌΡ‹Π΅ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ! GIL, ΠΈΠ»ΠΈ Global Interpreter Lock дСсятилСтиями оставался Ρ‚Π΅ΠΌΠΎΠΉ обсуТдСния ΠΈ Π΄Π΅Π±Π°Ρ‚ΠΎΠ² срСди питонистов. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ GIL ? GIL, сокращСниС ΠΎΡ‚ Global Interpreter Lock,...
Meta Canonicalnull
Boilerpipe Text
Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ слоТности ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ВрСмя Π½Π° ΠΏΡ€ΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅ 9 ΠΌΠΈΠ½ ΠžΡ…Π²Π°Ρ‚ ΠΈ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ 48K ΠžΠ±Π·ΠΎΡ€ ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΡƒΠ²Π°ΠΆΠ°Π΅ΠΌΡ‹Π΅ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ! GIL, ΠΈΠ»ΠΈ Global Interpreter Lock дСсятилСтиями оставался Ρ‚Π΅ΠΌΠΎΠΉ обсуТдСния ΠΈ Π΄Π΅Π±Π°Ρ‚ΠΎΠ² срСди питонистов. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ GIL ? GIL, сокращСниС ΠΎΡ‚ Global Interpreter Lock, прСдставляСт собой Π²Π°ΠΆΠ½ΡƒΡŽ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ Π² Python. Он прСдставляСт собой ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ доступ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Python interpreter Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… срСдах, Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Ρ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ лишь ΠΎΠ΄Π½Ρƒ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ Π·Π° Ρ€Π°Π·. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, Ρ…ΠΎΡ‚ΡŒ ΠΈ заботится ΠΎ бСзопасности ΠΈ цСлостности Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ становится ΠΊΠ°ΠΌΠ½Π΅ΠΌ прСткновСния для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ стрСмится максимально Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π» многоядСрных процСссоров. Когда ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ многозадачности Π² Python, имССтся Π² Π²ΠΈΠ΄Ρƒ использованиС мноТСства ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈΠ»ΠΈ процСссов для выполнСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡. Π­Ρ‚ΠΎ особСнно Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ Π² прилоТСниях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ выполнСния большого числа Π·Π°Π΄Π°Ρ‡. Однако GIL вносит ограничСния Π² этот процСсс, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠΌΠ΅Π΅Ρ‚ доступ ΠΊ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ Python Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π’ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Ρ… вСрсиях Python, GIL Π½Π΅ сущСствовал. Однако, ΠΊΠΎΠ³Π΄Π° Python Π½Π°Ρ‡Π°Π» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, стало ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ доступом ΠΊ ΠΎΠ±Ρ‰ΠΈΠΌ рСсурсам. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π“Π²ΠΈΠ΄ΠΎ Π²Π°Π½ Россум ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π²Π½Π΅Π΄Ρ€ΠΈΠ»ΠΈ GIL, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Python. GIL Π±Ρ‹Π» Π²Π²Π΅Π΄Π΅Π½ Π½Π΅ ΠΊΠ°ΠΊ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, Π° скорСС ΠΊΠ°ΠΊ нСобходимая ΠΌΠ΅Ρ€Π° для обСспСчСния бСзопасности Π² срСдС многозадачности. Python создавался с ΡƒΠΏΠΎΡ€ΠΎΠΌ Π½Π° простоту ΠΈ удобство Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ структуры Π΄Π°Π½Π½Ρ‹Ρ… Python, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ списки ΠΈ словари, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ Π² процСссС выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Python ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ для использования, Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ создаСт ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ срСдС. Π‘Π΅Π· GIL, мноТСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с этими структурами Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ Π±Ρ‹ ΠΊ нСпрСдсказуСмому повСдСнию ΠΈ Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹ΠΌ Π³ΠΎΠ½ΠΊΠ°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ…. Π’Π°ΠΆΠ½Ρ‹ΠΌ этапом Π±Ρ‹Π»ΠΎ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ GIL Π² вСрсии 1.5 Python. ΠžΡ‚ этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° GIL оставался Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ ядра Python. Π‘ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ, ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ развития языка, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π»ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ GIL ΠΌΠ΅Π½Π΅Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌ. Π’ вСрсии Python 3.2 Π±Ρ‹Π»Π° Π²Π½Π΅Π΄Ρ€Π΅Π½Π° систСма, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ GIL Π½Π° нСсколько частСй, Ρ‡Ρ‚ΠΎ Π΄Π°Π»ΠΎ нСбольшой прирост ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… случаях. Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ GIL GIL - это ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ дСйствуСт ΠΊΠ°ΠΊ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ Python Π² ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΠΉ срСдС Python, Π² ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Python-ΠΊΠΎΠ΄. ΠŸΡ€ΠΈΠΌΠ΅Ρ€: import threading def worker(): for _ in range(1000000): pass # Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° thread1 = threading.Thread(target=worker) thread2 = threading.Thread(target=worker) # ЗапускаСм ΠΏΠΎΡ‚ΠΎΠΊΠΈ thread1.start() thread2.start() # Π–Π΄Π΅ΠΌ, ΠΏΠΎΠΊΠ° ΠΎΠ±Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡΡ thread1.join() thread2.join() Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ worker , которая просто выполняСт Ρ†ΠΈΠΊΠ». Однако ΠΈΠ·-Π·Π° GIL Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ Π°ΠΊΡ‚ΠΈΠ²Π΅Π½ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π­Ρ‚ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ сущСствСнно Π²Π»ΠΈΡΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, особСнно Π² ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½Ρ‹Ρ… прилоТСниях. Python прСдоставляСт встроСнный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ threading для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ. Π’Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ GIL сущСствуСт Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Python ΠΈ Π½Π΅ зависит ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Π΄Π°ΠΆΠ΅ Ссли ваша опСрационная систСма ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ, GIL ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ использованиС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ядСр процСссора. Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π² Python, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ экзСмпляры класса Thread ΠΈΠ· модуля threading ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΈΡ…. Π’Π°ΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ GIL ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°, поэтому ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π² Python подходят для Π·Π°Π΄Π°Ρ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ большС связаны с ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ΠΌ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, Ρ‡Π΅ΠΌ с интСнсивной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΡ€ΠΈΠΌΠ΅Ρ€: import threading def print_numbers(): for i in range(1, 6): print(f"Number: {i}") def print_letters(): for letter in 'abcde': print(f"Letter: {letter}") # Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° thread1 = threading.Thread(target=print_numbers) thread2 = threading.Thread(target=print_letters) # ЗапускаСм ΠΏΠΎΡ‚ΠΎΠΊΠΈ thread1.start() thread2.start() # Π–Π΄Π΅ΠΌ, ΠΏΠΎΠΊΠ° ΠΎΠ±Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡΡ thread1.join() thread2.join() Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создаСм Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° для Π²Ρ‹Π²ΠΎΠ΄Π° чисСл ΠΈ Π±ΡƒΠΊΠ². ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° GIL Π½Π΅ влияСт Π½Π° этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π° экранС, Ρ‡Ρ‚ΠΎ являСтся ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°. ВзаимодСйствиС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² с GIL ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ, особСнно Ссли Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ. Когда нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π³ΠΎΠ½ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… (race conditions). ΠŸΡ€ΠΈΠΌΠ΅Ρ€: import threading counter = 0 def increment(): global counter for _ in range(1000000): counter += 1 # Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° thread1 = threading.Thread(target=increment) thread2 = threading.Thread(target=increment) # ЗапускаСм ΠΏΠΎΡ‚ΠΎΠΊΠΈ thread1.start() thread2.start() # Π–Π΄Π΅ΠΌ, ΠΏΠΎΠΊΠ° ΠΎΠ±Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡΡ thread1.join() thread2.join() print("Counter:", counter) Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΉ счСтчик. ВслСдствиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ GIL, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΈ зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ доступ ΠΊ счСтчику Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. Бпособы ΠΎΠ±Ρ…ΠΎΠ΄Π° GIL Один ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ эффСктивных способов ΠΎΠ±ΠΎΠΉΡ‚ΠΈ GIL - это использованиС многопроцСссорной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ вмСсто ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ процСсс ΠΈΠΌΠ΅Π΅Ρ‚ свой собствСнный ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Python ΠΈ собствСнный GIL, ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… ядрах процСссора. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования многопроцСссинга Π² Python с использованиСм модуля multiprocessing : import multiprocessing def worker(data): # Π—Π΄Π΅ΡΡŒ происходит ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… result = data * 2 return result data = [1, 2, 3, 4, 5] # Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΡƒΠ» процСссов pool = multiprocessing.Pool(processes=multiprocessing.cpu_count()) # Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ многопроцСссорный ΠΏΡƒΠ» для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… results = pool.map(worker, data) # Π—Π°Π²Π΅Ρ€ΡˆΠ°Π΅ΠΌ ΠΏΡƒΠ» pool.close() pool.join() print("Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹:", results) Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ создаСт ΠΏΡƒΠ» процСссов ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ для ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ позволяСт эффСктивно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ ограничСния GIL. Помимо multiprocessing , сущСствуСт нСсколько Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅ высокоуровнСвый доступ ΠΊ многопроцСссорной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅. НапримСр, concurrent.futures позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡƒΠ»Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ процСссов, прСдоставляя ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ интСрфСйс для выполнСния ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования concurrent.futures с ΠΏΡƒΠ»ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²: import concurrent.futures def worker(data): # Π—Π΄Π΅ΡΡŒ происходит ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… result = data * 2 return result data = [1, 2, 3, 4, 5] # Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΡƒΠ» ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² with concurrent.futures.ThreadPoolExecutor() as executor: results = list(executor.map(worker, data)) print("Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹:", results) Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ concurrent.futures , Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»Π΅Π³ΠΊΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΡƒΠ»Π°ΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ процСссов Π² зависимости ΠΎΡ‚ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ вашСго прилоТСния. Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΈΠΌ способом ΠΎΠ±ΠΎΠΉΡ‚ΠΈ GIL являСтся использованиС C-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ. Python позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π½Π° C, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ интСнсивныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ GIL. Π­Ρ‚ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΌΠΎΠ³ΡƒΡ‚ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ с систСмными Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС прСимущСства многозадачности. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ создания C-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ для Python: #include <Python.h> static PyObject* my_extension_function(PyObject* self, PyObject* args) { // Π—Π΄Π΅ΡΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ интСнсивныС вычислСния int result = 0; // ... return Py_BuildValue("i", result); } static PyMethodDef my_extension_methods[] = { {"my_extension_function", my_extension_function, METH_VARARGS, "ОписаниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ"}, {NULL, NULL, 0, NULL} }; static struct PyModuleDef my_extension_module = { PyModuleDef_HEAD_INIT, "my_extension", "ОписаниС модуля", -1, my_extension_methods }; PyMODINIT_FUNC PyInit_my_extension(void) { return PyModule_Create(&my_extension_module); } Π—Π°Ρ‚Π΅ΠΌ этот C-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Python, обСспСчивая Π±ΠΎΠ»Π΅Π΅ эффСктивноС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ интСнсивных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. Π‘ΠΎΠ²Π΅Ρ‚Ρ‹ ΠΏΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Если ваши ΠΏΠΎΡ‚ΠΎΠΊΠΈ часто Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ·-Π·Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, это ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΡ…ΡƒΠ΄ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. ВмСсто Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠ»ΠΈ асинхронный ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ простоя ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°: import socket def non_blocking_network_operation(): # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ сокСта sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setblocking(0) try: # ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ sock.connect(("example.com", 80)) except BlockingIOError: pass # ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ выполнСния ΠΊΠΎΠ΄Π° Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° нСзависимыС Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΈΡ… ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ. ВмСсто использования ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Python, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с GIL, рассмотритС использованиС Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ процСссы ΠΈΠ»ΠΈ асинхронноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования асинхронного ΠΊΠΎΠ΄Π° с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ asyncio : import asyncio async def async_task(): await asyncio.sleep(1) print("Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ асинхронной Π·Π°Π΄Π°Ρ‡ΠΈ") async def main(): tasks = [async_task() for _ in range(10)] await asyncio.gather(*tasks) if __name__ == "__main__": asyncio.run(main()) АсинхронноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ позволяСт эффСктивно ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Π‘ΠΎΠ²Π΅Ρ‚Ρ‹ ΠΏΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹: Π’ Python сущСствуСт мноТСство встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΈ быстрСС, Ρ‡Π΅ΠΌ Ρ€ΡƒΡ‡Π½Ρ‹Π΅ Π°Π½Π°Π»ΠΎΠ³ΠΈ. НапримСр, вмСсто ΠΎΠ±Ρ…ΠΎΠ΄Π° списка Ρ†ΠΈΠΊΠ»ΠΎΠΌ for , ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ map() , filter() , sum() ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅. numbers = [1, 2, 3, 4, 5] # ΠŸΠ»ΠΎΡ…ΠΎΠΉ способ total = 0 for num in numbers: total += num # Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ способ total = sum(numbers) Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹: Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π² Python ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π»Π΅Π½ΠΈΠ²ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ значСния ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. # ΠŸΠ»ΠΎΡ…ΠΎΠΉ способ squares = [] for num in range(1, 1000000): squares.append(num ** 2) # Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ способ squares = (num ** 2 for num in range(1, 1000000)) Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½Ρ‹Ρ… вычислСний: Если Π²Ρ‹ выполняСтС ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ вычислСния нСсколько Ρ€Π°Π·, сохранитС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π΅Π³ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ. # ΠŸΠ»ΠΎΡ…ΠΎΠΉ способ result1 = complex_computation(data) result2 = complex_computation(data) # Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ способ result = complex_computation(data) result1 = result result2 = result Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ set вмСсто списка для быстрого поиска: Если Π²Π°ΠΌ часто приходится ΠΈΡΠΊΠ°Ρ‚ΡŒ элСмСнты Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ мноТСства (set), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ быстроС врСмя доступа, Ρ‡Π΅ΠΌ списки. # ΠŸΠ»ΠΎΡ…ΠΎΠΉ способ items = [1, 2, 3, 4, 5] if 3 in items: print("НайдСн!") # Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ способ items = {1, 2, 3, 4, 5} if 3 in items: print("НайдСн!") ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ: ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ контСкстныС ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρ‹ для автоматичСского закрытия Ρ„Π°ΠΉΠ»ΠΎΠ². ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΈ записывайтС Π΄Π°Π½Π½Ρ‹Π΅ порциями, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ использованиС памяти. # ΠŸΠ»ΠΎΡ…ΠΎΠΉ способ file = open("data.txt", "r") data = file.read() file.close() # Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ способ with open("data.txt", "r") as file: data = file.read(1024) Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ: Python ΠΈΠΌΠ΅Π΅Ρ‚ мноТСство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π² стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, парсинга XML, Ρ€Π°Π±ΠΎΡ‚Ρ‹ с JSON ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π°Π΄Π°Ρ‡. ВмСсто написания собствСнных Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅. # ΠŸΠ»ΠΎΡ…ΠΎΠΉ способ import my_custom_parser data = my_custom_parser.parse_xml(xml_data) # Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ способ import xml.etree.ElementTree as ET root = ET.fromstring(xml_data) Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ I/O: ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ»ΠΈ сСтСвыС запросы, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Ρ‚Ρ€Π°Ρ‚Π½Ρ‹ΠΌΠΈ. ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ мноТСства Ρ‚Π°ΠΊΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠΉΡ‚Π΅ ΠΈΡ… ΠΈ выполняйтС ΠΎΠ΄Π½ΠΈΠΌ запросом. # ΠŸΠ»ΠΎΡ…ΠΎΠΉ способ for url in urls: response = requests.get(url) process_data(response.text) # Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ способ responses = [requests.get(url) for url in urls] for response in responses: process_data(response.text) Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ с Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ выполнСния: ΠŸΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΡΡ‚Π°Ρ€Π°ΠΉΡ‚Π΅ΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ врСмя выполнСния (O(n)), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π΄ΠΎΠ»Π³ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. # ΠŸΠ»ΠΎΡ…ΠΎΠΉ способ def find_max(numbers): max_num = numbers[0] for num in numbers: if num > max_num: max_num = num return max_num # Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ способ max_num = max(numbers) Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅: ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ вашСго ΠΊΠΎΠ΄Π° ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π²Ρ‹ΡΠ²ΠΈΡ‚ΡŒ мСста, Π³Π΄Π΅ тратится большС всСго Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΈ ΡΠΎΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡ΠΈΡ‚ΡŒ усилия Π½Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Π°ΠΆΠ½Ρ‹Ρ… частСй. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования модуля cProfile : import cProfile def my_function(): # Код для профилирования cProfile.run("my_function()") Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ использования Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…: Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΌΠ΅Π½Π΅Π΅ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌ ΠΈ управляСмым. ВмСсто Π½ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². # ΠŸΠ»ΠΎΡ…ΠΎΠΉ способ count = 0 def increment_count(): global count count += 1 # Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ способ def increment_count(count): return count + 1 count = increment_count(count) Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ GIL - это ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Python, которая ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Python-ΠΊΠΎΠ΄Π° Π² ΠΎΠ΄Π½ΠΎΠΌ процСссС. Π­Ρ‚ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², особСнно Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ сталкиваСтся с ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. Если Π²Ρ‹ ΡƒΠΆΠ΅ ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π½Π°Β Python ΠΈ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Ρ‹ΠΉΡ‚ΠΈ Π·Π°Β Ρ€Π°ΠΌΠΊΠΈ «скриптов для сСбя», курс Python Developer. Professional даст систСмноС ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ: от асинхронности ΠΈ мСтапрограммирования до вСб‑фрСймворков ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ…. Π–ΠΈΠ²Ρ‹Π΅ Π²Π΅Π±ΠΈΠ½Π°Ρ€Ρ‹, ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° ΠΈ ΠΊΠΎΠ΄β€‘Ρ€Π΅Π²ΡŒΡŽ от спСциалистов ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠΊΠ°Ρ‡Π°Ρ‚ΡŒΡΡ до уровня middle+ ΠΈΠ»ΠΈΒ senior. А Π²Β  ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ курсов Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π΅Ρ‰Π΅ большС ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ ЯП ΠΈ уровням ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ.
Markdown
[ВсС ΠΏΠΎΡ‚ΠΎΠΊΠΈ](https://habr.com/ru/articles/) [Π’ΠΎΠΉΡ‚ΠΈ](https://habr.com/kek/v1/auth/habrahabr/?back=/ru/companies/otus/articles/769448/&hl=ru) [![](https://habrastorage.org/getpro/habr/company/a65/525/4fe/a655254feebb0b25a027b5e276ea6489.png)](https://habr.com/ru/companies/otus/profile/) 512K+ ΠžΡ…Π²Π°Ρ‚ Π·Π° 30 Π΄Π½Π΅ΠΉ [OTUS](https://habr.com/ru/companies/otus/profile/) Π Π°Π·Π²ΠΈΠ²Π°Π΅ΠΌ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ, обучая ΠΈΡ… создатСлСй 710,29 Π Π΅ΠΉΡ‚ΠΈΠ½Π³ 185 396 ΠŸΠΎΠ΄ΠΏΠΈΡΡ‡ΠΈΠΊΠΈ ΠŸΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ [![](https://habrastorage.org/r/w48/getpro/habr/avatars/206/581/b2f/206581b2ffb082e2150bed36b72e71d9.jpeg)](https://habr.com/ru/users/badcasedaily1/) [badcasedaily1](https://habr.com/ru/users/badcasedaily1/) 24 ΠΎΠΊΡ‚ 2023 Π² 10:48 # Как устроСн GIL (Global Interpreter Lock) Π² Python: влияниС Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ 9 ΠΌΠΈΠ½ 48K [Π‘Π»ΠΎΠ³ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ OTUS](https://habr.com/ru/companies/otus/articles/)[Python \*](https://habr.com/ru/hubs/python/) [ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ \*](https://habr.com/ru/hubs/programming/) ΠžΠ±Π·ΠΎΡ€ ![](https://habrastorage.org/r/w1560/getpro/habr/upload_files/7ca/0ac/0c1/7ca0ac0c1746170648cccffdec4155b8.jpg) *ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΡƒΠ²Π°ΠΆΠ°Π΅ΠΌΡ‹Π΅ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ\!* GIL, ΠΈΠ»ΠΈ Global Interpreter Lock дСсятилСтиями оставался Ρ‚Π΅ΠΌΠΎΠΉ обсуТдСния ΠΈ Π΄Π΅Π±Π°Ρ‚ΠΎΠ² срСди питонистов. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ **GIL**? GIL, сокращСниС ΠΎΡ‚ Global Interpreter Lock, прСдставляСт собой Π²Π°ΠΆΠ½ΡƒΡŽ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ Π² Python. Он прСдставляСт собой ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ доступ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Python interpreter Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… срСдах, Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Ρ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ лишь ΠΎΠ΄Π½Ρƒ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ Π·Π° Ρ€Π°Π·. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, Ρ…ΠΎΡ‚ΡŒ ΠΈ заботится ΠΎ бСзопасности ΠΈ цСлостности Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ становится ΠΊΠ°ΠΌΠ½Π΅ΠΌ прСткновСния для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ стрСмится максимально Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π» многоядСрных процСссоров. Когда ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ многозадачности Π² Python, имССтся Π² Π²ΠΈΠ΄Ρƒ использованиС мноТСства ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈΠ»ΠΈ процСссов для выполнСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡. Π­Ρ‚ΠΎ особСнно Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ Π² прилоТСниях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ выполнСния большого числа Π·Π°Π΄Π°Ρ‡. Однако GIL вносит ограничСния Π² этот процСсс, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠΌΠ΅Π΅Ρ‚ доступ ΠΊ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ Python Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π’ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Ρ… вСрсиях Python, GIL Π½Π΅ сущСствовал. Однако, ΠΊΠΎΠ³Π΄Π° Python Π½Π°Ρ‡Π°Π» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, стало ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ доступом ΠΊ ΠΎΠ±Ρ‰ΠΈΠΌ рСсурсам. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π“Π²ΠΈΠ΄ΠΎ Π²Π°Π½ Россум ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π²Π½Π΅Π΄Ρ€ΠΈΠ»ΠΈ GIL, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Python. GIL Π±Ρ‹Π» Π²Π²Π΅Π΄Π΅Π½ Π½Π΅ ΠΊΠ°ΠΊ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, Π° скорСС ΠΊΠ°ΠΊ нСобходимая ΠΌΠ΅Ρ€Π° для обСспСчСния бСзопасности Π² срСдС многозадачности. Python создавался с ΡƒΠΏΠΎΡ€ΠΎΠΌ Π½Π° простоту ΠΈ удобство Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ структуры Π΄Π°Π½Π½Ρ‹Ρ… Python, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ списки ΠΈ словари, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ Π² процСссС выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Python ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ для использования, Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ создаСт ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ срСдС. Π‘Π΅Π· GIL, мноТСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с этими структурами Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ Π±Ρ‹ ΠΊ нСпрСдсказуСмому повСдСнию ΠΈ Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹ΠΌ Π³ΠΎΠ½ΠΊΠ°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ…. Π’Π°ΠΆΠ½Ρ‹ΠΌ этапом Π±Ρ‹Π»ΠΎ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ GIL Π² вСрсии 1.5 Python. ΠžΡ‚ этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° GIL оставался Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ ядра Python. Π‘ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ, ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ развития языка, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π»ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ GIL ΠΌΠ΅Π½Π΅Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌ. Π’ вСрсии Python 3.2 Π±Ρ‹Π»Π° Π²Π½Π΅Π΄Ρ€Π΅Π½Π° систСма, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ GIL Π½Π° нСсколько частСй, Ρ‡Ρ‚ΠΎ Π΄Π°Π»ΠΎ нСбольшой прирост ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… случаях. ## Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ GIL GIL - это ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ дСйствуСт ΠΊΠ°ΠΊ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ Python Π² ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΠΉ срСдС Python, Π² ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Python-ΠΊΠΎΠ΄. **ΠŸΡ€ΠΈΠΌΠ΅Ρ€:** ``` ``` Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ `worker`, которая просто выполняСт Ρ†ΠΈΠΊΠ». Однако ΠΈΠ·-Π·Π° GIL Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ Π°ΠΊΡ‚ΠΈΠ²Π΅Π½ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π­Ρ‚ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ сущСствСнно Π²Π»ΠΈΡΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, особСнно Π² ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½Ρ‹Ρ… прилоТСниях. Python прСдоставляСт встроСнный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ `threading` для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ. Π’Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ GIL сущСствуСт Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Python ΠΈ Π½Π΅ зависит ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Π΄Π°ΠΆΠ΅ Ссли ваша опСрационная систСма ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ, GIL ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ использованиС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ядСр процСссора. Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π² Python, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ экзСмпляры класса `Thread` ΠΈΠ· модуля `threading` ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΈΡ…. Π’Π°ΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ GIL ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°, поэтому ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π² Python подходят для Π·Π°Π΄Π°Ρ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ большС связаны с ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ΠΌ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, Ρ‡Π΅ΠΌ с интСнсивной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. **ΠŸΡ€ΠΈΠΌΠ΅Ρ€:** ``` ``` Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создаСм Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° для Π²Ρ‹Π²ΠΎΠ΄Π° чисСл ΠΈ Π±ΡƒΠΊΠ². ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° GIL Π½Π΅ влияСт Π½Π° этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π° экранС, Ρ‡Ρ‚ΠΎ являСтся ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°. ВзаимодСйствиС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² с GIL ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ, особСнно Ссли Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ. Когда нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π³ΠΎΠ½ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… (race conditions). **ΠŸΡ€ΠΈΠΌΠ΅Ρ€:** ``` ``` Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΉ счСтчик. ВслСдствиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ GIL, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΈ зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ доступ ΠΊ счСтчику Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. ### Бпособы ΠΎΠ±Ρ…ΠΎΠ΄Π° GIL Один ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ эффСктивных способов ΠΎΠ±ΠΎΠΉΡ‚ΠΈ GIL - это использованиС многопроцСссорной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ вмСсто ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ процСсс ΠΈΠΌΠ΅Π΅Ρ‚ свой собствСнный ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Python ΠΈ собствСнный GIL, ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… ядрах процСссора. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования многопроцСссинга Π² Python с использованиСм модуля `multiprocessing`: ``` ``` Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ создаСт ΠΏΡƒΠ» процСссов ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ для ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ позволяСт эффСктивно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ ограничСния GIL. Помимо `multiprocessing`, сущСствуСт нСсколько Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅ высокоуровнСвый доступ ΠΊ многопроцСссорной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅. НапримСр, `concurrent.futures` позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡƒΠ»Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ процСссов, прСдоставляя ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ интСрфСйс для выполнСния ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования `concurrent.futures` с ΠΏΡƒΠ»ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²: ``` ``` Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ `concurrent.futures`, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»Π΅Π³ΠΊΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΡƒΠ»Π°ΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ процСссов Π² зависимости ΠΎΡ‚ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ вашСго прилоТСния. Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΈΠΌ способом ΠΎΠ±ΠΎΠΉΡ‚ΠΈ GIL являСтся использованиС C-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ. Python позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π½Π° C, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ интСнсивныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ GIL. Π­Ρ‚ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΌΠΎΠ³ΡƒΡ‚ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ с систСмными Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС прСимущСства многозадачности. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ создания C-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ для Python: ``` ``` Π—Π°Ρ‚Π΅ΠΌ этот C-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Python, обСспСчивая Π±ΠΎΠ»Π΅Π΅ эффСктивноС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ интСнсивных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. #### Π‘ΠΎΠ²Π΅Ρ‚Ρ‹ ΠΏΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Если ваши ΠΏΠΎΡ‚ΠΎΠΊΠΈ часто Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ·-Π·Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, это ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΡ…ΡƒΠ΄ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. ВмСсто Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠ»ΠΈ асинхронный ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ простоя ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². **ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°:** ``` ``` Для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° нСзависимыС Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΈΡ… ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ. ВмСсто использования ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Python, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с GIL, рассмотритС использованиС Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ процСссы ΠΈΠ»ΠΈ асинхронноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. **ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования асинхронного ΠΊΠΎΠ΄Π° с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ** `asyncio`: ``` ``` АсинхронноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ позволяСт эффСктивно ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². ## Π‘ΠΎΠ²Π΅Ρ‚Ρ‹ ΠΏΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ 1. **Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹:** Π’ Python сущСствуСт мноТСство встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΈ быстрСС, Ρ‡Π΅ΠΌ Ρ€ΡƒΡ‡Π½Ρ‹Π΅ Π°Π½Π°Π»ΠΎΠ³ΠΈ. НапримСр, вмСсто ΠΎΠ±Ρ…ΠΎΠ΄Π° списка Ρ†ΠΈΠΊΠ»ΠΎΠΌ `for`, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ `map()`, `filter()`, `sum()` ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅. ``` ``` 2. **Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹:** Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π² Python ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π»Π΅Π½ΠΈΠ²ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ значСния ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. ``` ``` 3. **Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½Ρ‹Ρ… вычислСний:** Если Π²Ρ‹ выполняСтС ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ вычислСния нСсколько Ρ€Π°Π·, сохранитС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π΅Π³ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ. ``` ``` 4. **Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ set вмСсто списка для быстрого поиска:** Если Π²Π°ΠΌ часто приходится ΠΈΡΠΊΠ°Ρ‚ΡŒ элСмСнты Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ мноТСства (set), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ быстроС врСмя доступа, Ρ‡Π΅ΠΌ списки. ``` ``` 5. **ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ:** ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ контСкстныС ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρ‹ для автоматичСского закрытия Ρ„Π°ΠΉΠ»ΠΎΠ². ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΈ записывайтС Π΄Π°Π½Π½Ρ‹Π΅ порциями, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ использованиС памяти. ``` ``` 6. **Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ:** Python ΠΈΠΌΠ΅Π΅Ρ‚ мноТСство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π² стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, парсинга XML, Ρ€Π°Π±ΠΎΡ‚Ρ‹ с JSON ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π°Π΄Π°Ρ‡. ВмСсто написания собствСнных Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅. ``` ``` 7. **Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ I/O:** ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ»ΠΈ сСтСвыС запросы, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Ρ‚Ρ€Π°Ρ‚Π½Ρ‹ΠΌΠΈ. ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ мноТСства Ρ‚Π°ΠΊΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠΉΡ‚Π΅ ΠΈΡ… ΠΈ выполняйтС ΠΎΠ΄Π½ΠΈΠΌ запросом. ``` ``` 8. **Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ с Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ выполнСния:** ΠŸΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΡΡ‚Π°Ρ€Π°ΠΉΡ‚Π΅ΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ врСмя выполнСния (O(n)), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π΄ΠΎΠ»Π³ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. ``` ``` 9. **Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅:** ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ вашСго ΠΊΠΎΠ΄Π° ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π²Ρ‹ΡΠ²ΠΈΡ‚ΡŒ мСста, Π³Π΄Π΅ тратится большС всСго Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΈ ΡΠΎΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡ΠΈΡ‚ΡŒ усилия Π½Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Π°ΠΆΠ½Ρ‹Ρ… частСй. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования модуля `cProfile`: ``` ``` 10. **Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ использования Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…:** Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΌΠ΅Π½Π΅Π΅ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌ ΠΈ управляСмым. ВмСсто Π½ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². ``` ``` ## Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ GIL - это ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Python, которая ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Python-ΠΊΠΎΠ΄Π° Π² ΠΎΠ΄Π½ΠΎΠΌ процСссС. Π­Ρ‚ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², особСнно Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ сталкиваСтся с ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. *** Если Π²Ρ‹ ΡƒΠΆΠ΅ ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π½Π° Python ΠΈ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Ρ‹ΠΉΡ‚ΠΈ Π·Π° Ρ€Π°ΠΌΠΊΠΈ «скриптов для сСбя», курс [Python Developer. Professional](https://otus.pw/5mJE/) даст систСмноС ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ: ΠΎΡ‚ асинхронности ΠΈ мСтапрограммирования Π΄ΠΎ вСб‑фрСймворков ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ…. Π–ΠΈΠ²Ρ‹Π΅ Π²Π΅Π±ΠΈΠ½Π°Ρ€Ρ‹, ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° ΠΈ ΠΊΠΎΠ΄β€‘Ρ€Π΅Π²ΡŒΡŽ ΠΎΡ‚ спСциалистов ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠΊΠ°Ρ‡Π°Ρ‚ΡŒΡΡ Π΄ΠΎ уровня middle+ ΠΈΠ»ΠΈ senior. А Π² [ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ курсов](https://otus.pw/htbgi/) Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π΅Ρ‰Π΅ большС ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ ЯП ΠΈ уровням ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ. Π’Π΅Π³ΠΈ: - [python](https://habr.com/ru/search/?target_type=posts&order=relevance&q=[python]) - [GIL](https://habr.com/ru/search/?target_type=posts&order=relevance&q=[GIL]) Π₯Π°Π±Ρ‹: - [Π‘Π»ΠΎΠ³ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ OTUS](https://habr.com/ru/companies/otus/articles/) - [Python](https://habr.com/ru/hubs/python/) - [ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅](https://habr.com/ru/hubs/programming/) \+9 122 [17](https://habr.com/ru/companies/otus/articles/769448/comments/) [![](https://habrastorage.org/getpro/habr/company/a65/525/4fe/a655254feebb0b25a027b5e276ea6489.png)](https://habr.com/ru/companies/otus/profile/) 512K+ ΠžΡ…Π²Π°Ρ‚ Π·Π° 30 Π΄Π½Π΅ΠΉ [OTUS](https://habr.com/ru/companies/otus/profile/) Π Π°Π·Π²ΠΈΠ²Π°Π΅ΠΌ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ, обучая ΠΈΡ… создатСлСй [Π‘Π°ΠΉΡ‚](https://otus.ru/)[Π’ΠšΠΎΠ½Ρ‚Π°ΠΊΡ‚Π΅](https://vk.com/club145052891)[Telegram](https://telegram.me/Otusjava) [![](https://habrastorage.org/getpro/habr/avatars/206/581/b2f/206581b2ffb082e2150bed36b72e71d9.jpeg)](https://habr.com/ru/users/badcasedaily1/) 128K+ ΠžΡ…Π²Π°Ρ‚ Π·Π° 30 Π΄Π½Π΅ΠΉ 144 ΠšΠ°Ρ€ΠΌΠ° artem[@badcasedaily1](https://habr.com/ru/users/badcasedaily1/) Motion – Peter Sandberg ΠŸΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ ΠŸΠΎΡ‚ΠΎΠΊ БэкСнд доступСн 24/7 благодаря ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ Π΄Ρ€ΡƒΠ·Π΅ΠΉ Π₯Π°Π±Ρ€Π° ![Π₯Π°Π±Ρ€ ΠšΠ°Ρ€ΡŒΠ΅Ρ€Π° ΠšΡƒΡ€ΡΡ‹](https://habrastorage.org/webt/qq/ey/pn/qqeypn-py71suynxbusbakjdfjw.png) Π₯Π°Π±Ρ€ ΠšΡƒΡ€ΡΡ‹ для бэкСндСров Π Π•ΠšΠ›ΠΠœΠ ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΡƒΠΌ, Π₯СкслСт, SkyPro, авторскиС курсы β€” собрали всСх ΠΈ попросили скидки. ΠžΡΡ‚Π°Π»ΠΎΡΡŒ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ\! [ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ](https://career.habr.com/courses/programmirovanie/backend-razrabotka/?erid=2VSb5zFkQ3T&utm_source=habr&utm_medium=sponsorship_hub) [ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² ΠΏΠΎΡ‚ΠΎΠΊ БэкСнд](https://habr.com/ru/flows/backend/) [ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ 17](https://habr.com/ru/companies/otus/articles/769448/comments/) ## ΠŸΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π›ΡƒΡ‡ΡˆΠΈΠ΅ Π·Π° сутки ΠŸΠΎΡ…ΠΎΠΆΠΈΠ΅ ## Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ Π‘Π°ΠΉΡ‚ [otus.ru](https://otus.ru/) Π”Π°Ρ‚Π° рСгистрации 22 ΠΌΠ°Ρ€Ρ‚Π° 2017 Π”Π°Ρ‚Π° основания 1 апрСля 2017 Π§ΠΈΡΠ»Π΅Π½Π½ΠΎΡΡ‚ΡŒ 101–200 Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ ΠœΠ΅ΡΡ‚ΠΎΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Россия ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚Π΅Π»ΡŒ [OTUS](https://habr.com/ru/users/MaxRokatansky/) Π’Π°Ρˆ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ - [Π’ΠΎΠΉΡ‚ΠΈ](https://habr.com/kek/v1/auth/habrahabr/?back=/ru/companies/otus/articles/769448/&hl=ru) - [РСгистрация](https://habr.com/kek/v1/auth/habrahabr-register/?back=/ru/companies/otus/articles/769448/&hl=ru) Π Π°Π·Π΄Π΅Π»Ρ‹ - [Π‘Ρ‚Π°Ρ‚ΡŒΠΈ](https://habr.com/ru/articles/) - [Новости](https://habr.com/ru/news/) - [Π₯Π°Π±Ρ‹](https://habr.com/ru/hubs/) - [Компании](https://habr.com/ru/companies/) - [Авторы](https://habr.com/ru/users/) - [ΠŸΠ΅ΡΠΎΡ‡Π½ΠΈΡ†Π°](https://habr.com/ru/sandbox/) Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ - [Устройство сайта](https://habr.com/ru/docs/help/) - [Для Π°Π²Ρ‚ΠΎΡ€ΠΎΠ²](https://habr.com/ru/docs/authors/codex/) - [Для ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ](https://habr.com/ru/docs/companies/corpblogs/) - [Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹](https://habr.com/ru/docs/docs/transparency/) - [БоглашСниС](https://account.habr.com/info/agreement/?hl=ru_RU) - [ΠšΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ](https://account.habr.com/info/confidential/?hl=ru_RU) Услуги - [ΠšΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ Π±Π»ΠΎΠ³](https://company.habr.com/ru/corporate-blogs/) - [МСдийная Ρ€Π΅ΠΊΠ»Π°ΠΌΠ°](https://company.habr.com/ru/advertising/) - [НативныС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹](https://company.habr.com/ru/native-special/) - [ΠžΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹](https://company.habr.com/ru/education-programs/) - [Π‘Ρ‚Π°Ρ€Ρ‚Π°ΠΏΠ°ΠΌ](https://company.habr.com/ru/hello-startup/) Настройка языка [ВСхничСская ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ°](https://habr.com/ru/feedback/) Β© 2006–2026, [Habr](https://company.habr.com/)
Readable Markdown
ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ 9 ΠΌΠΈΠ½ 48K ΠžΠ±Π·ΠΎΡ€ ![](https://habrastorage.org/r/w1560/getpro/habr/upload_files/7ca/0ac/0c1/7ca0ac0c1746170648cccffdec4155b8.jpg) *ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΡƒΠ²Π°ΠΆΠ°Π΅ΠΌΡ‹Π΅ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ\!* GIL, ΠΈΠ»ΠΈ Global Interpreter Lock дСсятилСтиями оставался Ρ‚Π΅ΠΌΠΎΠΉ обсуТдСния ΠΈ Π΄Π΅Π±Π°Ρ‚ΠΎΠ² срСди питонистов. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ **GIL**? GIL, сокращСниС ΠΎΡ‚ Global Interpreter Lock, прСдставляСт собой Π²Π°ΠΆΠ½ΡƒΡŽ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ Π² Python. Он прСдставляСт собой ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ доступ ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Python interpreter Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… срСдах, Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Ρ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ лишь ΠΎΠ΄Π½Ρƒ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ Π·Π° Ρ€Π°Π·. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, Ρ…ΠΎΡ‚ΡŒ ΠΈ заботится ΠΎ бСзопасности ΠΈ цСлостности Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ становится ΠΊΠ°ΠΌΠ½Π΅ΠΌ прСткновСния для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ стрСмится максимально Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π» многоядСрных процСссоров. Когда ΠΌΡ‹ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ многозадачности Π² Python, имССтся Π² Π²ΠΈΠ΄Ρƒ использованиС мноТСства ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈΠ»ΠΈ процСссов для выполнСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡. Π­Ρ‚ΠΎ особСнно Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ Π² прилоТСниях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ выполнСния большого числа Π·Π°Π΄Π°Ρ‡. Однако GIL вносит ограничСния Π² этот процСсс, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠΌΠ΅Π΅Ρ‚ доступ ΠΊ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ Python Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π’ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Ρ… вСрсиях Python, GIL Π½Π΅ сущСствовал. Однако, ΠΊΠΎΠ³Π΄Π° Python Π½Π°Ρ‡Π°Π» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, стало ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ доступом ΠΊ ΠΎΠ±Ρ‰ΠΈΠΌ рСсурсам. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π“Π²ΠΈΠ΄ΠΎ Π²Π°Π½ Россум ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π²Π½Π΅Π΄Ρ€ΠΈΠ»ΠΈ GIL, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Python. GIL Π±Ρ‹Π» Π²Π²Π΅Π΄Π΅Π½ Π½Π΅ ΠΊΠ°ΠΊ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅, Π° скорСС ΠΊΠ°ΠΊ нСобходимая ΠΌΠ΅Ρ€Π° для обСспСчСния бСзопасности Π² срСдС многозадачности. Python создавался с ΡƒΠΏΠΎΡ€ΠΎΠΌ Π½Π° простоту ΠΈ удобство Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ структуры Π΄Π°Π½Π½Ρ‹Ρ… Python, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ списки ΠΈ словари, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ Π² процСссС выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Python ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ для использования, Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ создаСт ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ срСдС. Π‘Π΅Π· GIL, мноТСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ с этими структурами Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ Π±Ρ‹ ΠΊ нСпрСдсказуСмому повСдСнию ΠΈ Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹ΠΌ Π³ΠΎΠ½ΠΊΠ°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ…. Π’Π°ΠΆΠ½Ρ‹ΠΌ этапом Π±Ρ‹Π»ΠΎ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ GIL Π² вСрсии 1.5 Python. ΠžΡ‚ этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° GIL оставался Ρ„ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ ядра Python. Π‘ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ, ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ развития языка, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π»ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ GIL ΠΌΠ΅Π½Π΅Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌ. Π’ вСрсии Python 3.2 Π±Ρ‹Π»Π° Π²Π½Π΅Π΄Ρ€Π΅Π½Π° систСма, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ GIL Π½Π° нСсколько частСй, Ρ‡Ρ‚ΠΎ Π΄Π°Π»ΠΎ нСбольшой прирост ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… случаях. ## Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ GIL GIL - это ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ дСйствуСт ΠΊΠ°ΠΊ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠΎΡ‚ΠΎΠΊΡƒ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π±Π°ΠΉΡ‚ΠΊΠΎΠ΄ Python Π² ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π² ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΠΉ срСдС Python, Π² ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Python-ΠΊΠΎΠ΄. **ΠŸΡ€ΠΈΠΌΠ΅Ρ€:** ``` import threading def worker(): for _ in range(1000000): pass # Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° thread1 = threading.Thread(target=worker) thread2 = threading.Thread(target=worker) # ЗапускаСм ΠΏΠΎΡ‚ΠΎΠΊΠΈ thread1.start() thread2.start() # Π–Π΄Π΅ΠΌ, ΠΏΠΎΠΊΠ° ΠΎΠ±Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡΡ thread1.join() thread2.join() ``` Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ `worker`, которая просто выполняСт Ρ†ΠΈΠΊΠ». Однако ΠΈΠ·-Π·Π° GIL Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ Π°ΠΊΡ‚ΠΈΠ²Π΅Π½ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π­Ρ‚ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ сущСствСнно Π²Π»ΠΈΡΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, особСнно Π² ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½Ρ‹Ρ… прилоТСниях. Python прСдоставляСт встроСнный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ `threading` для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ. Π’Π°ΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ GIL сущСствуСт Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Python ΠΈ Π½Π΅ зависит ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Π΄Π°ΠΆΠ΅ Ссли ваша опСрационная систСма ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ, GIL ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ использованиС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ядСр процСссора. Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ Π² Python, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ экзСмпляры класса `Thread` ΠΈΠ· модуля `threading` ΠΈ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΈΡ…. Π’Π°ΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ GIL ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°, поэтому ΠΏΠΎΡ‚ΠΎΠΊΠΈ Π² Python подходят для Π·Π°Π΄Π°Ρ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ большС связаны с ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ΠΌ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, Ρ‡Π΅ΠΌ с интСнсивной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. **ΠŸΡ€ΠΈΠΌΠ΅Ρ€:** ``` import threading def print_numbers(): for i in range(1, 6): print(f"Number: {i}") def print_letters(): for letter in 'abcde': print(f"Letter: {letter}") # Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° thread1 = threading.Thread(target=print_numbers) thread2 = threading.Thread(target=print_letters) # ЗапускаСм ΠΏΠΎΡ‚ΠΎΠΊΠΈ thread1.start() thread2.start() # Π–Π΄Π΅ΠΌ, ΠΏΠΎΠΊΠ° ΠΎΠ±Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡΡ thread1.join() thread2.join() ``` Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ создаСм Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° для Π²Ρ‹Π²ΠΎΠ΄Π° чисСл ΠΈ Π±ΡƒΠΊΠ². ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° GIL Π½Π΅ влияСт Π½Π° этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π° экранС, Ρ‡Ρ‚ΠΎ являСтся ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°. ВзаимодСйствиС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² с GIL ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ, особСнно Ссли Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ. Когда нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π³ΠΎΠ½ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… (race conditions). **ΠŸΡ€ΠΈΠΌΠ΅Ρ€:** ``` import threading counter = 0 def increment(): global counter for _ in range(1000000): counter += 1 # Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° thread1 = threading.Thread(target=increment) thread2 = threading.Thread(target=increment) # ЗапускаСм ΠΏΠΎΡ‚ΠΎΠΊΠΈ thread1.start() thread2.start() # Π–Π΄Π΅ΠΌ, ΠΏΠΎΠΊΠ° ΠΎΠ±Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ‚ΡΡ thread1.join() thread2.join() print("Counter:", counter) ``` Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π΄Π²Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΉ счСтчик. ВслСдствиС Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ GIL, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ этой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΈ зависит ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ доступ ΠΊ счСтчику Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. ### Бпособы ΠΎΠ±Ρ…ΠΎΠ΄Π° GIL Один ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ эффСктивных способов ΠΎΠ±ΠΎΠΉΡ‚ΠΈ GIL - это использованиС многопроцСссорной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ вмСсто ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ процСсс ΠΈΠΌΠ΅Π΅Ρ‚ свой собствСнный ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Python ΠΈ собствСнный GIL, ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… ядрах процСссора. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования многопроцСссинга Π² Python с использованиСм модуля `multiprocessing`: ``` import multiprocessing def worker(data): # Π—Π΄Π΅ΡΡŒ происходит ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… result = data * 2 return result data = [1, 2, 3, 4, 5] # Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΡƒΠ» процСссов pool = multiprocessing.Pool(processes=multiprocessing.cpu_count()) # Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ многопроцСссорный ΠΏΡƒΠ» для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… results = pool.map(worker, data) # Π—Π°Π²Π΅Ρ€ΡˆΠ°Π΅ΠΌ ΠΏΡƒΠ» pool.close() pool.join() print("Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹:", results) ``` Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ создаСт ΠΏΡƒΠ» процСссов ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ для ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ позволяСт эффСктивно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ ограничСния GIL. Помимо `multiprocessing`, сущСствуСт нСсколько Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅ высокоуровнСвый доступ ΠΊ многопроцСссорной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅. НапримСр, `concurrent.futures` позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡƒΠ»Ρ‹ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ процСссов, прСдоставляя ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ интСрфСйс для выполнСния ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования `concurrent.futures` с ΠΏΡƒΠ»ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²: ``` import concurrent.futures def worker(data): # Π—Π΄Π΅ΡΡŒ происходит ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… result = data * 2 return result data = [1, 2, 3, 4, 5] # Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΡƒΠ» ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² with concurrent.futures.ThreadPoolExecutor() as executor: results = list(executor.map(worker, data)) print("Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹:", results) ``` Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ `concurrent.futures`, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»Π΅Π³ΠΊΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΡƒΠ»Π°ΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ процСссов Π² зависимости ΠΎΡ‚ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ вашСго прилоТСния. Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΈΠΌ способом ΠΎΠ±ΠΎΠΉΡ‚ΠΈ GIL являСтся использованиС C-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ. Python позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π½Π° C, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ интСнсивныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ GIL. Π­Ρ‚ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ΠΌΠΎΠ³ΡƒΡ‚ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ с систСмными Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС прСимущСства многозадачности. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ создания C-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ для Python: ``` #include <Python.h> static PyObject* my_extension_function(PyObject* self, PyObject* args) { // Π—Π΄Π΅ΡΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ интСнсивныС вычислСния int result = 0; // ... return Py_BuildValue("i", result); } static PyMethodDef my_extension_methods[] = { {"my_extension_function", my_extension_function, METH_VARARGS, "ОписаниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ"}, {NULL, NULL, 0, NULL} }; static struct PyModuleDef my_extension_module = { PyModuleDef_HEAD_INIT, "my_extension", "ОписаниС модуля", -1, my_extension_methods }; PyMODINIT_FUNC PyInit_my_extension(void) { return PyModule_Create(&my_extension_module); } ``` Π—Π°Ρ‚Π΅ΠΌ этот C-Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Python, обСспСчивая Π±ΠΎΠ»Π΅Π΅ эффСктивноС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ интСнсивных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. #### Π‘ΠΎΠ²Π΅Ρ‚Ρ‹ ΠΏΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Если ваши ΠΏΠΎΡ‚ΠΎΠΊΠΈ часто Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ΡΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ·-Π·Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, это ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΡ…ΡƒΠ΄ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. ВмСсто Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠ»ΠΈ асинхронный ΠΊΠΎΠ΄, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ простоя ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². **ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°:** ``` import socket def non_blocking_network_operation(): # Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ сокСта sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setblocking(0) try: # ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ sock.connect(("example.com", 80)) except BlockingIOError: pass # ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ выполнСния ΠΊΠΎΠ΄Π° Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ``` Для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Π½Π° нСзависимыС Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΈΡ… ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ. ВмСсто использования ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Python, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с GIL, рассмотритС использованиС Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ процСссы ΠΈΠ»ΠΈ асинхронноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. **ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования асинхронного ΠΊΠΎΠ΄Π° с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ** `asyncio`: ``` import asyncio async def async_task(): await asyncio.sleep(1) print("Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ асинхронной Π·Π°Π΄Π°Ρ‡ΠΈ") async def main(): tasks = [async_task() for _ in range(10)] await asyncio.gather(*tasks) if __name__ == "__main__": asyncio.run(main()) ``` АсинхронноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ позволяСт эффСктивно ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². ## Π‘ΠΎΠ²Π΅Ρ‚Ρ‹ ΠΏΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ 1. **Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹:** Π’ Python сущСствуСт мноТСство встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΈ быстрСС, Ρ‡Π΅ΠΌ Ρ€ΡƒΡ‡Π½Ρ‹Π΅ Π°Π½Π°Π»ΠΎΠ³ΠΈ. НапримСр, вмСсто ΠΎΠ±Ρ…ΠΎΠ΄Π° списка Ρ†ΠΈΠΊΠ»ΠΎΠΌ `for`, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ `map()`, `filter()`, `sum()` ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅. ``` numbers = [1, 2, 3, 4, 5] # ΠŸΠ»ΠΎΡ…ΠΎΠΉ способ total = 0 for num in numbers: total += num # Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ способ total = sum(numbers) ``` 2. **Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹:** Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π² Python ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π»Π΅Π½ΠΈΠ²ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ значСния ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ. ``` # ΠŸΠ»ΠΎΡ…ΠΎΠΉ способ squares = [] for num in range(1, 1000000): squares.append(num ** 2) # Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ способ squares = (num ** 2 for num in range(1, 1000000)) ``` 3. **Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½Ρ‹Ρ… вычислСний:** Если Π²Ρ‹ выполняСтС ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ вычислСния нСсколько Ρ€Π°Π·, сохранитС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π΅Π³ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ. ``` # ΠŸΠ»ΠΎΡ…ΠΎΠΉ способ result1 = complex_computation(data) result2 = complex_computation(data) # Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ способ result = complex_computation(data) result1 = result result2 = result ``` 4. **Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ set вмСсто списка для быстрого поиска:** Если Π²Π°ΠΌ часто приходится ΠΈΡΠΊΠ°Ρ‚ΡŒ элСмСнты Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ мноТСства (set), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ быстроС врСмя доступа, Ρ‡Π΅ΠΌ списки. ``` # ΠŸΠ»ΠΎΡ…ΠΎΠΉ способ items = [1, 2, 3, 4, 5] if 3 in items: print("НайдСн!") # Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ способ items = {1, 2, 3, 4, 5} if 3 in items: print("НайдСн!") ``` 5. **ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ:** ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ контСкстныС ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρ‹ для автоматичСского закрытия Ρ„Π°ΠΉΠ»ΠΎΠ². ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΈ записывайтС Π΄Π°Π½Π½Ρ‹Π΅ порциями, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ использованиС памяти. ``` # ΠŸΠ»ΠΎΡ…ΠΎΠΉ способ file = open("data.txt", "r") data = file.read() file.close() # Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ способ with open("data.txt", "r") as file: data = file.read(1024) ``` 6. **Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ· стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ:** Python ΠΈΠΌΠ΅Π΅Ρ‚ мноТСство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Π² стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, парсинга XML, Ρ€Π°Π±ΠΎΡ‚Ρ‹ с JSON ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π°Π΄Π°Ρ‡. ВмСсто написания собствСнных Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅. ``` # ΠŸΠ»ΠΎΡ…ΠΎΠΉ способ import my_custom_parser data = my_custom_parser.parse_xml(xml_data) # Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ способ import xml.etree.ElementTree as ET root = ET.fromstring(xml_data) ``` 7. **Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ I/O:** ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ»ΠΈ сСтСвыС запросы, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Ρ‚Ρ€Π°Ρ‚Π½Ρ‹ΠΌΠΈ. ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ мноТСства Ρ‚Π°ΠΊΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠΉΡ‚Π΅ ΠΈΡ… ΠΈ выполняйтС ΠΎΠ΄Π½ΠΈΠΌ запросом. ``` # ΠŸΠ»ΠΎΡ…ΠΎΠΉ способ for url in urls: response = requests.get(url) process_data(response.text) # Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ способ responses = [requests.get(url) for url in urls] for response in responses: process_data(response.text) ``` 8. **Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ с Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ выполнСния:** ΠŸΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΡΡ‚Π°Ρ€Π°ΠΉΡ‚Π΅ΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ врСмя выполнСния (O(n)), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π΄ΠΎΠ»Π³ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. ``` # ΠŸΠ»ΠΎΡ…ΠΎΠΉ способ def find_max(numbers): max_num = numbers[0] for num in numbers: if num > max_num: max_num = num return max_num # Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ способ max_num = max(numbers) ``` 9. **Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅:** ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ вашСго ΠΊΠΎΠ΄Π° ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π²Ρ‹ΡΠ²ΠΈΡ‚ΡŒ мСста, Π³Π΄Π΅ тратится большС всСго Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΈ ΡΠΎΡΡ€Π΅Π΄ΠΎΡ‚ΠΎΡ‡ΠΈΡ‚ΡŒ усилия Π½Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π²Π°ΠΆΠ½Ρ‹Ρ… частСй. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования модуля `cProfile`: ``` import cProfile def my_function(): # Код для профилирования cProfile.run("my_function()") ``` 10. **Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ использования Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…:** Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΌΠ΅Π½Π΅Π΅ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌ ΠΈ управляСмым. ВмСсто Π½ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². ``` # ΠŸΠ»ΠΎΡ…ΠΎΠΉ способ count = 0 def increment_count(): global count count += 1 # Π₯ΠΎΡ€ΠΎΡˆΠΈΠΉ способ def increment_count(count): return count + 1 count = increment_count(count) ``` ## Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ GIL - это ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Python, которая ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Python-ΠΊΠΎΠ΄Π° Π² ΠΎΠ΄Π½ΠΎΠΌ процСссС. Π­Ρ‚ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², особСнно Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ сталкиваСтся с ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°Ρ‡Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. *** Если Π²Ρ‹ ΡƒΠΆΠ΅ ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π½Π° Python ΠΈ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Ρ‹ΠΉΡ‚ΠΈ Π·Π° Ρ€Π°ΠΌΠΊΠΈ «скриптов для сСбя», курс [Python Developer. Professional](https://otus.pw/5mJE/) даст систСмноС ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ: ΠΎΡ‚ асинхронности ΠΈ мСтапрограммирования Π΄ΠΎ вСб‑фрСймворков ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° Π΄Π°Π½Π½Ρ‹Ρ…. Π–ΠΈΠ²Ρ‹Π΅ Π²Π΅Π±ΠΈΠ½Π°Ρ€Ρ‹, ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° ΠΈ ΠΊΠΎΠ΄β€‘Ρ€Π΅Π²ΡŒΡŽ ΠΎΡ‚ спСциалистов ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠΊΠ°Ρ‡Π°Ρ‚ΡŒΡΡ Π΄ΠΎ уровня middle+ ΠΈΠ»ΠΈ senior. А Π² [ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ курсов](https://otus.pw/htbgi/) Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π΅Ρ‰Π΅ большС ΠΎΠ±ΡƒΡ‡Π°ΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΏΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌ ЯП ΠΈ уровням ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ.
Shard134 (laksa)
Root Hash14843476518697139734
Unparsed URLcom,habr!/ru/companies/otus/articles/769448/ s443