Каждый процесс имеет собственную память, потоки одного процесса имеют доступ к памяти родительского процесса. Таким образом, один GIL на процесс. GIL существует для предотвращения одновременного изменения одной и той же части памяти разными потоками.
Lock - это примитив в поточном модуле, который позволяет только одному потоку иметь доступ к некоторой переменной в текущий момент, он используется для разных счетчиков. или, например, мы хотим, чтобы потоки записывали в файл один за другим, а не все вместе (обратите внимание, что GIL не влияет на операции IN / OUT, тем самым можно записывать в файл все вместе).
Пример блокировки потока:
import threading
import logging
def worker_with(lock):
with lock: # block, then release
logging.debug('Lock acquired via with')
def worker_no_with(lock):
lock.acquire() # block
try:
logging.debug('Lock acquired directly')
finally:
lock.release() # release
logging.basicConfig(level=logging.DEBUG, format='(%(threadName)-10s) %(message)s',)
lock = threading.Lock() # Lock instance
w = threading.Thread(target=worker_with, args=(lock,))
nw = threading.Thread(target=worker_no_with, args=(lock,))
w.start()
nw.start()