← Назад к вопросам

Отпускает ли GIL функция time.sleep?

1.2 Junior🔥 181 комментариев
#Python Core#Асинхронность и многопоточность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Отпускает ли 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 работает хорошо для сетевых запросов и файловых операций.

Отпускает ли GIL функция time.sleep? | PrepBro