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()