βΉοΈ Skipped - page is already crawled
| Filter | Status | Condition | Details |
|---|---|---|---|
| HTTP status | PASS | download_http_code = 200 | HTTP 200 |
| Age cutoff | PASS | download_stamp > now() - 6 MONTH | 0.4 months ago |
| History drop | PASS | isNull(history_drop_reason) | No drop reason |
| Spam/ban | PASS | fh_dont_index != 1 AND ml_spam_score = 0 | ml_spam_score=0 |
| Canonical | PASS | meta_canonical IS NULL OR = '' OR = src_unparsed | Not set |
| Property | Value |
|---|---|
| URL | https://habr.com/ru/companies/otus/articles/769448/ |
| Last Crawled | 2026-04-09 10:26:26 (10 days ago) |
| First Indexed | 2023-10-24 11:27:25 (2 years ago) |
| HTTP Status Code | 200 |
| Meta Title | ΠΠ°ΠΊ ΡΡΡΡΠΎΠ΅Π½ GIL (Global Interpreter Lock) Π² Python: Π²Π»ΠΈΡΠ½ΠΈΠ΅ Π½Π° ΠΌΠ½ΠΎΠ³ΠΎΠ·Π°Π΄Π°ΡΠ½ΠΎΡΡΡ ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ / Π₯Π°Π±Ρ |
| Meta Description | ΠΡΠΈΠ²Π΅Ρ, ΡΠ²Π°ΠΆΠ°Π΅ΠΌΡΠ΅ ΡΠΈΡΠ°ΡΠ΅Π»ΠΈ! GIL, ΠΈΠ»ΠΈ Global Interpreter Lock Π΄Π΅ΡΡΡΠΈΠ»Π΅ΡΠΈΡΠΌΠΈ ΠΎΡΡΠ°Π²Π°Π»ΡΡ ΡΠ΅ΠΌΠΎΠΉ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡ ΠΈ Π΄Π΅Π±Π°ΡΠΎΠ² ΡΡΠ΅Π΄ΠΈ ΠΏΠΈΡΠΎΠ½ΠΈΡΡΠΎΠ². Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ GIL ? GIL, ΡΠΎΠΊΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΎΡ Global Interpreter Lock,... |
| Meta Canonical | null |
| 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://habr.com/ru/companies/otus/profile/)
512K+
ΠΡ
Π²Π°Ρ Π·Π° 30 Π΄Π½Π΅ΠΉ
[OTUS](https://habr.com/ru/companies/otus/profile/)
Π Π°Π·Π²ΠΈΠ²Π°Π΅ΠΌ ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ, ΠΎΠ±ΡΡΠ°Ρ ΠΈΡ
ΡΠΎΠ·Π΄Π°ΡΠ΅Π»Π΅ΠΉ
710,29
Π Π΅ΠΉΡΠΈΠ½Π³
185 396
ΠΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠΈ
ΠΠΎΠ΄ΠΏΠΈΡΠ°ΡΡΡΡ
[](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/)
ΠΠ±Π·ΠΎΡ

*ΠΡΠΈΠ²Π΅Ρ, ΡΠ²Π°ΠΆΠ°Π΅ΠΌΡΠ΅ ΡΠΈΡΠ°ΡΠ΅Π»ΠΈ\!*
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://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://habr.com/ru/users/badcasedaily1/)
128K+
ΠΡ
Π²Π°Ρ Π·Π° 30 Π΄Π½Π΅ΠΉ
144
ΠΠ°ΡΠΌΠ°
artem[@badcasedaily1](https://habr.com/ru/users/badcasedaily1/)
Motion β Peter Sandberg
ΠΠΎΠ΄ΠΏΠΈΡΠ°ΡΡΡΡ
ΠΠΎΡΠΎΠΊ ΠΡΠΊΠ΅Π½Π΄ Π΄ΠΎΡΡΡΠΏΠ΅Π½ 24/7 Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ΅ Π΄ΡΡΠ·Π΅ΠΉ Π₯Π°Π±ΡΠ°

Π₯Π°Π±Ρ ΠΡΡΡΡ Π΄Π»Ρ Π±ΡΠΊΠ΅Π½Π΄Π΅ΡΠΎΠ²
Π ΠΠΠΠΠΠ
ΠΡΠ°ΠΊΡΠΈΠΊΡΠΌ, Π₯Π΅ΠΊΡΠ»Π΅Ρ, 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
ΠΠ±Π·ΠΎΡ

*ΠΡΠΈΠ²Π΅Ρ, ΡΠ²Π°ΠΆΠ°Π΅ΠΌΡΠ΅ ΡΠΈΡΠ°ΡΠ΅Π»ΠΈ\!*
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/) Π²Ρ Π½Π°ΠΉΠ΄Π΅ΡΠ΅ Π΅ΡΠ΅ Π±ΠΎΠ»ΡΡΠ΅ ΠΎΠ±ΡΡΠ°ΡΡΠΈΡ
ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ ΠΏΠΎ ΡΠ°Π·Π½ΡΠΌ Π―Π ΠΈ ΡΡΠΎΠ²Π½ΡΠΌ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠΈ. |
| Shard | 134 (laksa) |
| Root Hash | 14843476518697139734 |
| Unparsed URL | com,habr!/ru/companies/otus/articles/769448/ s443 |