Гильдии: все, что нужно знать о преимуществах и доступе в Gil
Global Interpreter Lock, сокращенно GIL, это механизм, который используется в интерпретаторе CPython для управления многопоточностью. GIL ограничивает выполнение Python-кода в единственном потоке на одном процессоре в любой момент времени. Таким образом, даже если ваш код Python имеет несколько потоков, они все будут работать на одном ядре процессора.
GIL был создан для обеспечения безопасности выполнения Python-кода и предотвращения гонок при одновременном доступе к разделяемым ресурсам, таким как объекты Python, память и файловые дескрипторы. Он также упрощает работу Python-разработчиков, позволяя им не беспокоиться о потенциальных проблемах многопоточности, таких как состояние гонки и взаимная блокировка.
Однако, GIL также имеет свои недостатки. Он ограничивает параллелизм выполнения Python-кода, что может привести к ухудшению производительности для многопоточных приложений. Ну, и отсутствие GIL может значительно повысить производительность многопоточных приложений.
Ниже приведен пример кода, который показывает влияние GIL на производительность:
import threading
import time
iterations = 10000000
def count_without_lock():
count = 0
for i in range(iterations):
count += 1
count -= 1 # use the CPU, but not for long.
def count_with_lock(lock):
count = 0
for i in range(iterations):
with lock:
count += 1
count -= 1
# use the CPU, but not for long.
if __name__ == '__main__':
start = time.time()
count_without_lock()
print('Without Lock: {} seconds'.format(time.time() - start))
start = time.time()
lock = threading.Lock()
count_with_lock(lock)
print('With Lock: {} seconds'.format(time.time() - start))
Выходные данные:
Without Lock: 0.6763970851898193 seconds
With Lock: 2.687861204147339 seconds
Как можно видеть, код без блокировки GIL выполняется в 4 раза быстрее, чем код с блокировкой. Это наиболее простой и яркий пример того, как влияет GIL на производительность Python кода.