Отпускает ли GIL функция time.sleep?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Отпускает ли GIL функция time.sleep?
Да, абсолютно да. Функция time.sleep() явно отпускает Global Interpreter Lock (GIL) на время сна. Это одна из ключевых особенностей этой функции и очень важно понимать для написания многопоточного кода на Python.
Почему это важно
Global Interpreter Lock (GIL) — это мьютекс в CPython, который позволяет только одному потоку исполнять Python байт-код за раз. Когда поток держит GIL, все остальные потоки заблокированы. Но есть исключения — некоторые операции отпускают GIL.
Как это работает
import time
import threading
data = 0
lock = threading.Lock()
def increment_with_sleep():
global data
for i in range(1000000):
time.sleep(0)
with lock:
data += 1
Практический пример с I/O операциями
Отпуск GIL крайне важен для I/O операций:
import time
import threading
def fetch_url(url):
print(f"Начало загрузки {url}")
time.sleep(2)
print(f"Загрузка {url} завершена")
start = time.time()
t1 = threading.Thread(target=fetch_url, args=("url1",))
t2 = threading.Thread(target=fetch_url, args=("url2",))
t1.start()
t2.start()
t1.join()
t2.join()
print(f"Параллельно: {time.time() - start:.1f}s")
Какие ещё операции отпускают GIL
Не только time.sleep() отпускает GIL:
- I/O операции —
open(),socket,requests - Криптография —
hashlib,ssl - Численные вычисления —
numpy - Системные вызовы —
subprocess
Почему не все операции отпускают GIL
def cpu_bound():
return sum(range(1000000))
from multiprocessing import Process
p1 = Process(target=cpu_bound)
p2 = Process(target=cpu_bound)
p1.start()
p2.start()
Вывод
time.sleep() активно отпускает GIL, что позволяет другим потокам выполняться одновременно. Это критически важно для I/O-bound операций и причина, по которой threading работает хорошо для сетевых запросов и файловых операций.