一、GIL - 全局解释器锁
有了GIL的存在,同一时刻同一进程中只有一个线程被执行;由于线程不能使用cpu多核,可以开多个进程实现线程的并发,因为每个进程都会含有一个线程,每个进程都有自己的GIL锁。
① py文件产生了多个线程,到达解释器
② 由于GIL锁问题,所以只能执行一个线程,先调用一个线程,进行编译器编译成 .pyc字节码
③ 字节码进入虚拟机形成机器码
④ 机器码由cpu执行
二、性能测试
多进程和多线程对应I/O 纯计算效率对比
View Code
1 import time
2 from multiprocessing import Process
3 from threading import Thread
4
5 # def func():
6 # num = 0
7 # for i in range(1,100000000):
8 # num += i
9
10 def func():
11 time.sleep(2)
12 print('xxxxxxxx')
13
14 if __name__ == '__main__':
15 p_s_t = time.time()
16 p_list = []
17 for i in range(10):
18 p = Process(target=func,)
19 p_list.append(p)
20 p.start()
21 [pp.join() for pp in p_list]
22 p_e_t = time.time()
23 p_dif_t = p_e_t - p_s_t
24
25 t_s_t = time.time()
26 t_list = []
27 for i in range(10):
28 t = Thread(target=func,)
29 t_list.append(t)
30 t.start()
31 [tt.join() for tt in t_list]
32 t_e_t = time.time()
33 t_dif_t = t_e_t - t_s_t
34
35 print('多进程执行的时间',p_dif_t)
36 print('多线程执行的时间',t_dif_t)
三、总结
应用:
多线程用于IO密集型,如socket,爬虫,web
多进程用于计算密集型,如金融分析