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()
我们每个处理器有 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()