# Cpyrhon解释器下有个全局解释器锁-GIL:在同一 # 在同一时刻,多线程中只有一个线程访问CPU # 有了全局解释器锁(GIL)后,在同一时刻只能有一个线程访问CPU。 # 全局解释器锁锁的是线程,而不是数据。 # 这种全局解释器锁的特性就是同一时间只有有一个线程访问CPU,所以在多个CPU的情况下,也只有一个线程在一个时间点访问CPU,这是Cpython解释器的特性,这是一个不好的特性 # 到目前为止并没有一个解释器语言可以充分使用多个CPU,一个时间点只能一者访问CPU # 在多线程环境中,python虚拟机按一下方式执行访问CPU: # 设置GIL # 切换到一个线程去执行 # 运行指定数量的字节码指令或线程后主动让出控制(可以调用time.sleep()) # 把线程设置为睡眠状态 # 解决GIL # 再次重复以上所有操作 # 高CPU: 在高CPU利用率的代码中,此时这种同一时刻只能有一个线程访问CPU机制会响应效率,如高计算类的代码中。如真遇到这种情况,可以用多进程,不用多线程处理 # 高IO:处理文件、处理web请求、爬取网页、设备文件、读写数据、send、recv,我们遇到的基本都是IO的,很少遇到计算类的东西 # 比较多线程与多进程的效率。多线程的执行效率会好些,在高IO的情况、和简单的计算类情况下 import time from threading import Thread from multiprocessing import Process def func(n): n + 1 if __name__ == '__main__': start = time.time() t_lst = [] for i in range(100): t = Thread(target=func, args=(i, )) t_lst.append(t) t.start() for t in t_lst: t.join() t1 = time.time() - start start2 = time.time() p_lst = [] for i in range(100): p = Process(target=func, args=(i, )) p_lst.append(p) p.start() for p in p_lst: p.join() t2 = time.time() - start2 print(t1, t2)