βΉοΈ 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.5 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://pythontalk.olegtalks.ru/optional_gil_313 |
| Last Crawled | 2026-04-06 19:09:15 (15 days ago) |
| First Indexed | 2025-07-24 16:22:01 (9 months ago) |
| HTTP Status Code | 200 |
| Meta Title | GIL ΡΡΠ°Π½Π΅Ρ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΌ Π² Python 3.13 β Teletype |
| Meta Description | GIL (ΠΎΠ½ ΠΆΠ΅ Global Interpreter Lock) ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ Π² Python Π²Π΅ΡΡΠΈΠΈ 3.13. ΠΠΎΠΊΠ° ΡΡΠ° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΠΎΠΉ. |
| Meta Canonical | null |
| Boilerpipe Text | GIL
(ΠΎΠ½ ΠΆΠ΅ Global Interpreter Lock) ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ Π² Python Π²Π΅ΡΡΠΈΠΈ 3.13. ΠΠΎΠΊΠ° ΡΡΠ° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΠΎΠΉ.
ΠΡΠΎ ΡΠ°ΠΊΠΎΠΉ ΡΡΠΎΡ GIL? ΠΡΠΎ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ CPython Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π±Π°ΠΉΡΠΊΠΎΠ΄Π° Python ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ.
ΠΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ
Π Python 3.13 ΡΡΠ΅Π΄ΠΈ ΠΏΡΠΎΡΠΈΡ
Π½ΠΎΠ²ΠΎΠ²Π²Π΅Π΄Π΅Π½ΠΈΠΉ ΠΏΡΠΈΠ²Π½Π΅ΡΡΡ ΡΠ΅ΠΆΠΈΠΌ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΡ
ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠΊΠ»ΡΡΠ°Π΅Ρ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ°, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ.
ΠΡΠΎ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΠΈ Π΅ΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ Π΅Π΅, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΊΠ°ΡΠ°ΡΡ Π±Π΅ΡΠ°-Π²Π΅ΡΡΠΈΡ Python 3.13
Π·Π΄Π΅ΡΡ
. Π Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΎΡΠΌΠ΅ΡΡΡΠ΅ ΠΎΠΏΡΠΈΡ Β«free threaded binaries(experimental)Β».
ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ GIL Π² Python 3.13
GIL Π±ΡΠ΄Π΅Ρ ΠΎΡΠΊΠ»ΡΡΠ΅Π½, Π΅ΡΠ»ΠΈ ΡΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°ΡΡ Python Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ
--disable-gil
. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ Π²ΠΊΠ»ΡΡΠ°ΡΡ ΠΈ ΠΎΡΠΊΠ»ΡΡΠ°ΡΡ GIL Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ
PYTHON_GIL
, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π° Π² Π·Π½Π°ΡΠ΅Π½ΠΈΡ 1 ΠΈ 0 ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ.
Π’Π°ΠΊΠΆΠ΅ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ½Π° ΠΎΠΏΡΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ
-X gil
, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π° Π² 0 (ΠΎΡΠΊΠ»ΡΡΠ΅Π½) ΠΈ 1 (Π²ΠΊΠ»ΡΡΠ΅Π½).
# v3.13
# GI ΠΎΡΠΊΠ»ΡΡΠ΅Π½
python3 -X gil=0 sample.py
# GIL Π²ΠΊΠ»ΡΡΠ΅Π½
python3 -X gil=1 sample.py
ΠΡΠΎΠ²Π΅ΡΠΈΡΡ, Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°Π½Ρ Π»ΠΈ Π² ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ΅ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ (
--disable-gil
) ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊ:
import sysconfig
print(sysconfig.get_config_var("Py_GIL_DISABLED"))
ΠΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ Π»ΠΈΠ±ΠΎ 0 (GIL Π²ΠΊΠ»ΡΡΠ΅Π½), Π»ΠΈΠ±ΠΎ 1 (GIL ΠΎΡΠΊΠ»ΡΡΠ΅Π½).
GIL Vs No GIL
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ ΠΏΠΎΠ²Π»ΠΈΡΠ΅Ρ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΡ
ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ GIL.
ΠΡΡΡ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΊΡΠΈΠΏΡ (
gil.py
), ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ ΡΠ°ΠΊΡΠΎΡΠΈΠ°Π» ΡΠΈΡΠ»Π° ΠΈ ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π² ΠΎΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΌ, ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΌ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ°Ρ
. ΠΠ°ΠΏΡΡΡΠΈΠΌ ΡΡΠΎΡ ΡΠΊΡΠΈΠΏΡ ΡΠ½Π°ΡΠ°Π»Π° Ρ GIL, Π° Π·Π°ΡΠ΅ΠΌ Π±Π΅Π· GIL.
import sys
import sysconfig
import math
import time
import threading
import multiprocessing
def compute_factorial(n):
return math.factorial(n)
# ΠΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅
def single_threaded_compute(n):
for num in n:
compute_factorial(num)
print("Π€Π°ΠΊΡΠΎΡΠΈΠ°Π» Π²ΡΡΠΈΡΠ»Π΅Π½ Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ.")
# ΠΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»Π½Π½Π΅Π½ΠΈΠ΅
def multi_threaded_compute(n):
threads = []
# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ 5 ΠΏΠΎΡΠΎΠΊΠΎΠ²
for num in n:
thread = threading.Thread(target=compute_factorial, args=(num,))
threads.append(thread)
thread.start()
# ΠΠ΄ΡΠΌ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ
ΠΏΠΎΡΠΎΠΊΠΎΠ²
for thread in threads:
thread.join()
print("Π€Π°ΠΊΡΠΎΡΠΈΠ°Π» Π²ΡΡΠΈΡΠ»Π΅Π½ Π² 5 ΠΏΠΎΡΠΎΠΊΠΎΠ²")
# ΠΡΠ»ΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅
def multi_processing_compute(n):
processes = []
# Π‘ΠΎΠ·Π΄Π°ΡΠΌ ΠΏΡΠΎΡΠ΅ΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΡΠ»Π°
for num in n:
process = multiprocessing.Process(target=compute_factorial, args=(num,))
processes.append(process)
process.start()
# ΠΠΆΠΈΠ΄Π°Π΅ΠΌ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π²ΡΠ΅Ρ
ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²
for process in processes:
process.join()
print("Π€Π°ΠΊΡΠΎΡΠΈΠ°Π» Π²ΡΡΠΈΡΠ»Π΅Π½ Π² ΠΌΡΠ»ΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅.")
def main():
# ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ Π²Π΅ΡΡΠΈΡ
print(f"ΠΠ΅ΡΡΠΈΡ Python: {sys.version}")
# GIL Status
status = sysconfig.get_config_var("Py_GIL_DISABLED")
if status is None:
print("GIL Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠΊΠ»ΡΡΠ΅Π½")
if status == 0:
print("GIL Π²ΠΊΠ»ΡΡΠ΅Π½")
if status == 1:
print("GIL ΠΎΡΠΊΠ»ΡΡΠ΅Π½")
numlist = [100000, 200000, 300000, 400000, 500000]
# ΠΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅
start = time.time()
single_threaded_compute(numlist)
end = time.time() - start
print(f"ΠΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ: {end:.2f} ΡΠ΅ΠΊΡΠ½Π΄")
# ΠΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅
start = time.time()
multi_threaded_compute(numlist)
end = time.time() - start
print(f"ΠΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ: {end:.2f} ΡΠ΅ΠΊΡΠ½Π΄")
# ΠΡΠ»ΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅
start = time.time()
multi_processing_compute(numlist)
end = time.time() - start
print(f"ΠΡΠ»ΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ: {end:.2f} ΡΠ΅ΠΊΡΠ½Π΄")
if __name__ == "__main__":
main()
Running
gil.py
with GIL
ΠΠ΅ΡΡΠΈΡ Python: 3.13.0b3 experimental free-threading build (tags/v3.13.0b3:7b41395, Jun 27 2024, 16:17:17) [MSC v.1940 64 bit (AMD64)]
GIL ΠΎΡΠΊΠ»ΡΡΠ΅Π½
Π€Π°ΠΊΡΠΎΡΠΈΠ°Π» Π²ΡΡΠΈΡΠ»Π΅Π½ Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ.
ΠΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ: 9.28 ΡΠ΅ΠΊΡΠ½Π΄
Π€Π°ΠΊΡΠΎΡΠΈΠ°Π» Π²ΡΡΠΈΡΠ»Π΅Π½ Π² 5 ΠΏΠΎΡΠΎΠΊΠΎΠ²
ΠΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ: 4.86 ΡΠ΅ΠΊΡΠ½Π΄
Π€Π°ΠΊΡΠΎΡΠΈΠ°Π» Π²ΡΡΠΈΡΠ»Π΅Π½ Π² ΠΌΡΠ»ΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅.
ΠΡΠ»ΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ: 6.14 ΡΠ΅ΠΊΡΠ½Π΄
ΠΠ΄Π΅ΡΡ Ρ Π½Π°Ρ ΡΡΠ΅ΡΡΡ Π±Π΅ΡΠ°-Π²Π΅ΡΡΠΈΡ Python 3.13 Ρ Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΠΌΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ, ΠΈ, ΠΊΠ°ΠΊ ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ, GIL ΠΎΡΠΊΠ»ΡΡΠ΅Π½.
ΠΠΎ ΡΠ°ΠΌΠΎΠ΅ Π³Π»Π°Π²Π½ΠΎΠ΅ - ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠ°Π·Π½ΠΈΡΡ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΡ
Π·Π°Π΄Π°ΡΠ°Ρ
, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅ΡΠΈΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠ½ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΡΠΊΠΎΡΠΎΡΡΠΈ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΡΡ
ΠΈ ΠΎΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½ΡΡ
Π·Π°Π΄Π°ΡΠ°Ρ
.
ππ»ΠΠΎΠ΄ΠΏΠΈΡΡΠ²Π°ΠΉΡΠ΅ΡΡ Π½Π° PythonTalk Π² Telegram
ππ»
π¨π»βπ»Π§Π°Ρ PythonTalk Π² Telegramπ¬
π© ΠΠΎΠ΄Π΄Π΅ΡΠΆΠ°ΡΡ ΠΊΠ°Π½Π°Π» π«Ά
ΠΡΡΠΎΡΠ½ΠΈΠΊ:
GeekPython |
| Markdown | [About Teletype](https://teletype.in/about)
[Join](https://teletype.in/login?redir=http://pythontalk.olegtalks.ru/optional_gil_313)
[PythonTalk @pythontalk](https://pythontalk.olegtalks.ru/)
September 6, 2024
# GIL ΡΡΠ°Π½Π΅Ρ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΌ Π² Python 3.13

[GIL](https://teletype.in/@pythontalk/gil) (ΠΎΠ½ ΠΆΠ΅ Global Interpreter Lock) ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ Π² Python Π²Π΅ΡΡΠΈΠΈ 3.13. ΠΠΎΠΊΠ° ΡΡΠ° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΠΎΠΉ.
ΠΡΠΎ ΡΠ°ΠΊΠΎΠΉ ΡΡΠΎΡ GIL? ΠΡΠΎ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ CPython Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π±Π°ΠΉΡΠΊΠΎΠ΄Π° Python ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ.
## ΠΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ
Π Python 3.13 ΡΡΠ΅Π΄ΠΈ ΠΏΡΠΎΡΠΈΡ
Π½ΠΎΠ²ΠΎΠ²Π²Π΅Π΄Π΅Π½ΠΈΠΉ ΠΏΡΠΈΠ²Π½Π΅ΡΡΡ ΡΠ΅ΠΆΠΈΠΌ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΡ
ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠΊΠ»ΡΡΠ°Π΅Ρ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ°, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ.
ΠΡΠΎ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΠΈ Π΅ΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ Π΅Π΅, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΊΠ°ΡΠ°ΡΡ Π±Π΅ΡΠ°-Π²Π΅ΡΡΠΈΡ Python 3.13 [Π·Π΄Π΅ΡΡ](https://www.python.org/downloads/release/python-3130b3/). Π Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΎΡΠΌΠ΅ΡΡΡΠ΅ ΠΎΠΏΡΠΈΡ Β«free threaded binaries(experimental)Β».
## ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ GIL Π² Python 3.13
GIL Π±ΡΠ΄Π΅Ρ ΠΎΡΠΊΠ»ΡΡΠ΅Π½, Π΅ΡΠ»ΠΈ ΡΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°ΡΡ Python Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ `--disable-gil`. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ Π²ΠΊΠ»ΡΡΠ°ΡΡ ΠΈ ΠΎΡΠΊΠ»ΡΡΠ°ΡΡ GIL Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ `PYTHON_GIL`, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π° Π² Π·Π½Π°ΡΠ΅Π½ΠΈΡ 1 ΠΈ 0 ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ.
Π’Π°ΠΊΠΆΠ΅ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ½Π° ΠΎΠΏΡΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ `-X gil`, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π° Π² 0 (ΠΎΡΠΊΠ»ΡΡΠ΅Π½) ΠΈ 1 (Π²ΠΊΠ»ΡΡΠ΅Π½).
```
# v3.13
# GI ΠΎΡΠΊΠ»ΡΡΠ΅Π½
python3 -X gil=0 sample.py
# GIL Π²ΠΊΠ»ΡΡΠ΅Π½
python3 -X gil=1 sample.py
```
ΠΡΠΎΠ²Π΅ΡΠΈΡΡ, Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°Π½Ρ Π»ΠΈ Π² ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ΅ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ (`--disable-gil`) ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊ:
```
import sysconfig
print(sysconfig.get_config_var("Py_GIL_DISABLED"))
```
ΠΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ Π»ΠΈΠ±ΠΎ 0 (GIL Π²ΠΊΠ»ΡΡΠ΅Π½), Π»ΠΈΠ±ΠΎ 1 (GIL ΠΎΡΠΊΠ»ΡΡΠ΅Π½).
## GIL Vs No GIL
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ ΠΏΠΎΠ²Π»ΠΈΡΠ΅Ρ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΡ
ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ GIL.
ΠΡΡΡ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΊΡΠΈΠΏΡ (`gil.py`), ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ ΡΠ°ΠΊΡΠΎΡΠΈΠ°Π» ΡΠΈΡΠ»Π° ΠΈ ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π² ΠΎΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΌ, ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΌ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ°Ρ
. ΠΠ°ΠΏΡΡΡΠΈΠΌ ΡΡΠΎΡ ΡΠΊΡΠΈΠΏΡ ΡΠ½Π°ΡΠ°Π»Π° Ρ GIL, Π° Π·Π°ΡΠ΅ΠΌ Π±Π΅Π· GIL.
```
import sys
import sysconfig
import math
import time
import threading
import multiprocessing
def compute_factorial(n):
return math.factorial(n)
# ΠΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅
def single_threaded_compute(n):
for num in n:
compute_factorial(num)
print("Π€Π°ΠΊΡΠΎΡΠΈΠ°Π» Π²ΡΡΠΈΡΠ»Π΅Π½ Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ.")
# ΠΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»Π½Π½Π΅Π½ΠΈΠ΅
def multi_threaded_compute(n):
threads = []
# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ 5 ΠΏΠΎΡΠΎΠΊΠΎΠ²
for num in n:
thread = threading.Thread(target=compute_factorial, args=(num,))
threads.append(thread)
thread.start()
# ΠΠ΄ΡΠΌ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ
ΠΏΠΎΡΠΎΠΊΠΎΠ²
for thread in threads:
thread.join()
print("Π€Π°ΠΊΡΠΎΡΠΈΠ°Π» Π²ΡΡΠΈΡΠ»Π΅Π½ Π² 5 ΠΏΠΎΡΠΎΠΊΠΎΠ²")
# ΠΡΠ»ΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅
def multi_processing_compute(n):
processes = []
# Π‘ΠΎΠ·Π΄Π°ΡΠΌ ΠΏΡΠΎΡΠ΅ΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΡΠ»Π°
for num in n:
process = multiprocessing.Process(target=compute_factorial, args=(num,))
processes.append(process)
process.start()
# ΠΠΆΠΈΠ΄Π°Π΅ΠΌ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π²ΡΠ΅Ρ
ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²
for process in processes:
process.join()
print("Π€Π°ΠΊΡΠΎΡΠΈΠ°Π» Π²ΡΡΠΈΡΠ»Π΅Π½ Π² ΠΌΡΠ»ΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅.")
def main():
# ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ Π²Π΅ΡΡΠΈΡ
print(f"ΠΠ΅ΡΡΠΈΡ Python: {sys.version}")
# GIL Status
status = sysconfig.get_config_var("Py_GIL_DISABLED")
if status is None:
print("GIL Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠΊΠ»ΡΡΠ΅Π½")
if status == 0:
print("GIL Π²ΠΊΠ»ΡΡΠ΅Π½")
if status == 1:
print("GIL ΠΎΡΠΊΠ»ΡΡΠ΅Π½")
numlist = [100000, 200000, 300000, 400000, 500000]
# ΠΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅
start = time.time()
single_threaded_compute(numlist)
end = time.time() - start
print(f"ΠΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ: {end:.2f} ΡΠ΅ΠΊΡΠ½Π΄")
# ΠΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅
start = time.time()
multi_threaded_compute(numlist)
end = time.time() - start
print(f"ΠΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ: {end:.2f} ΡΠ΅ΠΊΡΠ½Π΄")
# ΠΡΠ»ΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅
start = time.time()
multi_processing_compute(numlist)
end = time.time() - start
print(f"ΠΡΠ»ΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ: {end:.2f} ΡΠ΅ΠΊΡΠ½Π΄")
if __name__ == "__main__":
main()
```
## Running `gil.py` with GIL
```
ΠΠ΅ΡΡΠΈΡ Python: 3.13.0b3 experimental free-threading build (tags/v3.13.0b3:7b41395, Jun 27 2024, 16:17:17) [MSC v.1940 64 bit (AMD64)]
GIL ΠΎΡΠΊΠ»ΡΡΠ΅Π½
Π€Π°ΠΊΡΠΎΡΠΈΠ°Π» Π²ΡΡΠΈΡΠ»Π΅Π½ Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ.
ΠΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ: 9.28 ΡΠ΅ΠΊΡΠ½Π΄
Π€Π°ΠΊΡΠΎΡΠΈΠ°Π» Π²ΡΡΠΈΡΠ»Π΅Π½ Π² 5 ΠΏΠΎΡΠΎΠΊΠΎΠ²
ΠΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ: 4.86 ΡΠ΅ΠΊΡΠ½Π΄
Π€Π°ΠΊΡΠΎΡΠΈΠ°Π» Π²ΡΡΠΈΡΠ»Π΅Π½ Π² ΠΌΡΠ»ΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅.
ΠΡΠ»ΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ: 6.14 ΡΠ΅ΠΊΡΠ½Π΄
```
ΠΠ΄Π΅ΡΡ Ρ Π½Π°Ρ ΡΡΠ΅ΡΡΡ Π±Π΅ΡΠ°-Π²Π΅ΡΡΠΈΡ Python 3.13 Ρ Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΠΌΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ, ΠΈ, ΠΊΠ°ΠΊ ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ, GIL ΠΎΡΠΊΠ»ΡΡΠ΅Π½.
ΠΠΎ ΡΠ°ΠΌΠΎΠ΅ Π³Π»Π°Π²Π½ΠΎΠ΅ - ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠ°Π·Π½ΠΈΡΡ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΡ
Π·Π°Π΄Π°ΡΠ°Ρ
, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅ΡΠΈΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠ½ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΡΠΊΠΎΡΠΎΡΡΠΈ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΡΡ
ΠΈ ΠΎΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½ΡΡ
Π·Π°Π΄Π°ΡΠ°Ρ
.
[ππ»ΠΠΎΠ΄ΠΏΠΈΡΡΠ²Π°ΠΉΡΠ΅ΡΡ Π½Π° PythonTalk Π² Telegram](https://t.me/pythontalk_ru) ππ»
[π¨π»βπ»Π§Π°Ρ PythonTalk Π² Telegramπ¬](https://t.me/pythontalk_chat)
[π© ΠΠΎΠ΄Π΄Π΅ΡΠΆΠ°ΡΡ ΠΊΠ°Π½Π°Π» π«Ά](https://pay.cloudtips.ru/p/a9faffbb)
> ΠΡΡΠΎΡΠ½ΠΈΠΊ: [GeekPython](https://geekpython.in/gil-become-optional-in-python)
[PythonTalk](https://pythontalk.olegtalks.ru/)
September 6, 2024, 05:56
0 views
0 reactions
0 replies
0 reposts
Repost
Share |
| Readable Markdown | [GIL](https://teletype.in/@pythontalk/gil) (ΠΎΠ½ ΠΆΠ΅ Global Interpreter Lock) ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ Π² Python Π²Π΅ΡΡΠΈΠΈ 3.13. ΠΠΎΠΊΠ° ΡΡΠ° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΠΎΠΉ.
ΠΡΠΎ ΡΠ°ΠΊΠΎΠΉ ΡΡΠΎΡ GIL? ΠΡΠΎ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ CPython Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π±Π°ΠΉΡΠΊΠΎΠ΄Π° Python ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΈΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ.
## ΠΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ
Π Python 3.13 ΡΡΠ΅Π΄ΠΈ ΠΏΡΠΎΡΠΈΡ
Π½ΠΎΠ²ΠΎΠ²Π²Π΅Π΄Π΅Π½ΠΈΠΉ ΠΏΡΠΈΠ²Π½Π΅ΡΡΡ ΡΠ΅ΠΆΠΈΠΌ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΡ
ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠΊΠ»ΡΡΠ°Π΅Ρ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ°, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ.
ΠΡΠΎ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ, ΠΈ Π΅ΡΠ»ΠΈ Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ Π΅Π΅, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΊΠ°ΡΠ°ΡΡ Π±Π΅ΡΠ°-Π²Π΅ΡΡΠΈΡ Python 3.13 [Π·Π΄Π΅ΡΡ](https://www.python.org/downloads/release/python-3130b3/). Π Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΎΡΠΌΠ΅ΡΡΡΠ΅ ΠΎΠΏΡΠΈΡ Β«free threaded binaries(experimental)Β».
## ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ GIL Π² Python 3.13
GIL Π±ΡΠ΄Π΅Ρ ΠΎΡΠΊΠ»ΡΡΠ΅Π½, Π΅ΡΠ»ΠΈ ΡΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°ΡΡ Python Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ `--disable-gil`. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ Π²ΠΊΠ»ΡΡΠ°ΡΡ ΠΈ ΠΎΡΠΊΠ»ΡΡΠ°ΡΡ GIL Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ `PYTHON_GIL`, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π° Π² Π·Π½Π°ΡΠ΅Π½ΠΈΡ 1 ΠΈ 0 ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ.
Π’Π°ΠΊΠΆΠ΅ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ½Π° ΠΎΠΏΡΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ `-X gil`, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π° Π² 0 (ΠΎΡΠΊΠ»ΡΡΠ΅Π½) ΠΈ 1 (Π²ΠΊΠ»ΡΡΠ΅Π½).
```
# v3.13
# GI ΠΎΡΠΊΠ»ΡΡΠ΅Π½
python3 -X gil=0 sample.py
# GIL Π²ΠΊΠ»ΡΡΠ΅Π½
python3 -X gil=1 sample.py
```
ΠΡΠΎΠ²Π΅ΡΠΈΡΡ, Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°Π½Ρ Π»ΠΈ Π² ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ΅ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ (`--disable-gil`) ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΠΊ:
```
import sysconfig
print(sysconfig.get_config_var("Py_GIL_DISABLED"))
```
ΠΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ Π»ΠΈΠ±ΠΎ 0 (GIL Π²ΠΊΠ»ΡΡΠ΅Π½), Π»ΠΈΠ±ΠΎ 1 (GIL ΠΎΡΠΊΠ»ΡΡΠ΅Π½).
## GIL Vs No GIL
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ ΠΏΠΎΠ²Π»ΠΈΡΠ΅Ρ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΡ
ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ GIL.
ΠΡΡΡ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΊΡΠΈΠΏΡ (`gil.py`), ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΡΠΈΡΠ»ΡΠ΅Ρ ΡΠ°ΠΊΡΠΎΡΠΈΠ°Π» ΡΠΈΡΠ»Π° ΠΈ ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅Ρ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π² ΠΎΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΌ, ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΌ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ°Ρ
. ΠΠ°ΠΏΡΡΡΠΈΠΌ ΡΡΠΎΡ ΡΠΊΡΠΈΠΏΡ ΡΠ½Π°ΡΠ°Π»Π° Ρ GIL, Π° Π·Π°ΡΠ΅ΠΌ Π±Π΅Π· GIL.
```
import sys
import sysconfig
import math
import time
import threading
import multiprocessing
def compute_factorial(n):
return math.factorial(n)
# ΠΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅
def single_threaded_compute(n):
for num in n:
compute_factorial(num)
print("Π€Π°ΠΊΡΠΎΡΠΈΠ°Π» Π²ΡΡΠΈΡΠ»Π΅Π½ Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ.")
# ΠΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»Π½Π½Π΅Π½ΠΈΠ΅
def multi_threaded_compute(n):
threads = []
# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ 5 ΠΏΠΎΡΠΎΠΊΠΎΠ²
for num in n:
thread = threading.Thread(target=compute_factorial, args=(num,))
threads.append(thread)
thread.start()
# ΠΠ΄ΡΠΌ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ
ΠΏΠΎΡΠΎΠΊΠΎΠ²
for thread in threads:
thread.join()
print("Π€Π°ΠΊΡΠΎΡΠΈΠ°Π» Π²ΡΡΠΈΡΠ»Π΅Π½ Π² 5 ΠΏΠΎΡΠΎΠΊΠΎΠ²")
# ΠΡΠ»ΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅
def multi_processing_compute(n):
processes = []
# Π‘ΠΎΠ·Π΄Π°ΡΠΌ ΠΏΡΠΎΡΠ΅ΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΡΠ»Π°
for num in n:
process = multiprocessing.Process(target=compute_factorial, args=(num,))
processes.append(process)
process.start()
# ΠΠΆΠΈΠ΄Π°Π΅ΠΌ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π²ΡΠ΅Ρ
ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²
for process in processes:
process.join()
print("Π€Π°ΠΊΡΠΎΡΠΈΠ°Π» Π²ΡΡΠΈΡΠ»Π΅Π½ Π² ΠΌΡΠ»ΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅.")
def main():
# ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ Π²Π΅ΡΡΠΈΡ
print(f"ΠΠ΅ΡΡΠΈΡ Python: {sys.version}")
# GIL Status
status = sysconfig.get_config_var("Py_GIL_DISABLED")
if status is None:
print("GIL Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠΊΠ»ΡΡΠ΅Π½")
if status == 0:
print("GIL Π²ΠΊΠ»ΡΡΠ΅Π½")
if status == 1:
print("GIL ΠΎΡΠΊΠ»ΡΡΠ΅Π½")
numlist = [100000, 200000, 300000, 400000, 500000]
# ΠΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅
start = time.time()
single_threaded_compute(numlist)
end = time.time() - start
print(f"ΠΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ: {end:.2f} ΡΠ΅ΠΊΡΠ½Π΄")
# ΠΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅
start = time.time()
multi_threaded_compute(numlist)
end = time.time() - start
print(f"ΠΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ: {end:.2f} ΡΠ΅ΠΊΡΠ½Π΄")
# ΠΡΠ»ΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅
start = time.time()
multi_processing_compute(numlist)
end = time.time() - start
print(f"ΠΡΠ»ΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ: {end:.2f} ΡΠ΅ΠΊΡΠ½Π΄")
if __name__ == "__main__":
main()
```
## Running `gil.py` with GIL
```
ΠΠ΅ΡΡΠΈΡ Python: 3.13.0b3 experimental free-threading build (tags/v3.13.0b3:7b41395, Jun 27 2024, 16:17:17) [MSC v.1940 64 bit (AMD64)]
GIL ΠΎΡΠΊΠ»ΡΡΠ΅Π½
Π€Π°ΠΊΡΠΎΡΠΈΠ°Π» Π²ΡΡΠΈΡΠ»Π΅Π½ Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ.
ΠΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π² ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ: 9.28 ΡΠ΅ΠΊΡΠ½Π΄
Π€Π°ΠΊΡΠΎΡΠΈΠ°Π» Π²ΡΡΠΈΡΠ»Π΅Π½ Π² 5 ΠΏΠΎΡΠΎΠΊΠΎΠ²
ΠΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ: 4.86 ΡΠ΅ΠΊΡΠ½Π΄
Π€Π°ΠΊΡΠΎΡΠΈΠ°Π» Π²ΡΡΠΈΡΠ»Π΅Π½ Π² ΠΌΡΠ»ΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅.
ΠΡΠ»ΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ: 6.14 ΡΠ΅ΠΊΡΠ½Π΄
```
ΠΠ΄Π΅ΡΡ Ρ Π½Π°Ρ ΡΡΠ΅ΡΡΡ Π±Π΅ΡΠ°-Π²Π΅ΡΡΠΈΡ Python 3.13 Ρ Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌΠΈ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΠΌΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ, ΠΈ, ΠΊΠ°ΠΊ ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ, GIL ΠΎΡΠΊΠ»ΡΡΠ΅Π½.
ΠΠΎ ΡΠ°ΠΌΠΎΠ΅ Π³Π»Π°Π²Π½ΠΎΠ΅ - ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠ°Π·Π½ΠΈΡΡ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΡΡ
Π·Π°Π΄Π°ΡΠ°Ρ
, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅ΡΠΈΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠ½ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΡΠΊΠΎΡΠΎΡΡΠΈ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΡΡ
ΠΈ ΠΎΠ΄Π½ΠΎΠΏΠΎΡΠΎΡΠ½ΡΡ
Π·Π°Π΄Π°ΡΠ°Ρ
.
[ππ»ΠΠΎΠ΄ΠΏΠΈΡΡΠ²Π°ΠΉΡΠ΅ΡΡ Π½Π° PythonTalk Π² Telegram](https://t.me/pythontalk_ru) ππ»
[π¨π»βπ»Π§Π°Ρ PythonTalk Π² Telegramπ¬](https://t.me/pythontalk_chat)
[π© ΠΠΎΠ΄Π΄Π΅ΡΠΆΠ°ΡΡ ΠΊΠ°Π½Π°Π» π«Ά](https://pay.cloudtips.ru/p/a9faffbb)
> ΠΡΡΠΎΡΠ½ΠΈΠΊ: [GeekPython](https://geekpython.in/gil-become-optional-in-python) |
| Shard | 18 (laksa) |
| Root Hash | 16686452927583697618 |
| Unparsed URL | ru,olegtalks!pythontalk,/optional_gil_313 s443 |