Python GIL 是由进程中的线程共享还是由所有进程中的所有线程共享?

Is the Python GIL shared by threads in a process or is it shared by all threads in all processes?

我们每个处理器有 1 个 GIL 整个计算机上有 1 个 GIL(由所有进程共享)吗?

当我们说共享变量在修改值时需要加锁,那么我们指的是在目标线程函数中声明的变量,还是那些在线程函数外声明并在线程函数中修改的变量?

每个进程都有自己的内存,一个进程的线程可以访问父进程的内存。所以每个进程一个 GIL。 GIL的存在是为了防止不同的线程同时改变内存的同一部分。

锁是线程模块中的一个原语,它只允许一个线程在当前时刻访问一些变量,它用于不同的计数器,或者例如。我们希望线程一个接一个地写入文件,而不是一起写入(注意 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()