Является ли Python GIL общим для потоков в процессе или для всех потоков во всех процессах? - PullRequest
0 голосов
/ 06 ноября 2019

У нас есть 1 GIL на процессор 1 GIL на весь компьютер (общий для всех процессов)?

Когда мы говорим, что общие переменные должны быть заблокированы при изменении значений, тогда мы имеем в виду переменные, объявленные вцелевая функция потока или те переменные, которые объявлены вне функции потока и изменены в функции потока?

1 Ответ

0 голосов
/ 06 ноября 2019

Каждый процесс имеет собственную память, потоки одного процесса имеют доступ к памяти родительского процесса. Таким образом, один 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()
...