GIL(全局解释器锁)

1. 单线程死循环

在VMware虚拟软件中将Ubuntu设置为单核cpu

# 主线程死循环,占满cpu
while True:
    pass

2. 多线程死循环

在VMware虚拟软件中将Ubuntu设置为双核cpu

import threading

#子线程死循环
def test():
    while True:
        pass


t1 = threading.Thread(target=test)
t1.start()

#主线程死循环
while True:
    pass

惊奇的发现:在双核cpu下,2个线程的程序,竟然只占用到50%,why......?

GIL

GIL 的全程为Global Interpreter Lock ,意即全局解释器锁。

在 Python 语言的主流实现 CPython 中,GIL 是一个货真价实的全局线程锁,在解释器解释执行任何 Python 代码时,都需要先获得这把锁才行,在遇到 I/O 操作时会释放这把锁。

如果是纯计算的程序,没有 I/O 操作,解释器会每隔 100 次操作就释放这把锁,让别的线程有机会执行

3. GIL的解决方式-多进程死循环

import multiprocessing

def deadLoop():
    while True:
        pass

#子进程死循环
p1 = multiprocessing.Process(target=deadLoop)
p1.start()

#主进程死循环
deadLoop()

4. GIL的解决方式-调用其它语言

loop.c(新建)

void DeadLoop()
{
    while(1)
    {
        ;
    }
}

编译(得到libdead_loop.so)

# 把一个c语言文件编译成一个动态库的命令(linux平台下):
# gcc xxx.c -shared -o libxxxx.so
gcc loop.c -shared -o libdead_loop.so

main.py(调用libdead_loop.so中的函数)

from ctypes import *
from threading import Thread

# 加载动态库
lib = cdll.LoadLibrary("./libdead_loop.so")

# 创建一个子线程,让其执行c语言编写的函数,此函数是一个死循环
t = Thread(target=lib.DeadLoop)
t.start()

# 主线程,也调用c语言编写的那个死循环函数
lib.DeadLoop()