53_并发编程-线程-GIL锁

Posted hq82

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了53_并发编程-线程-GIL锁相关的知识,希望对你有一定的参考价值。

一、GIL - 全局解释器锁
 
  有了GIL的存在,同一时刻同一进程中只有一个线程被执行;由于线程不能使用cpu多核,可以开多个进程实现线程的并发,因为每个进程都会含有一个线程,每个进程都有自己的GIL锁。
  
  技术分享图片

 

    
 
            ① py文件产生了多个线程,到达解释器
            ② 由于GIL锁问题,所以只能执行一个线程,先调用一个线程,进行编译器编译成 .pyc字节码
            ③ 字节码进入虚拟机形成机器码
            ④ 机器码由cpu执行
 
二、性能测试
 
  多进程和多线程对应I/O 纯计算效率对比
技术分享图片
 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)
View Code
 
三、总结
    
  应用:
    多线程用于IO密集型,如socket,爬虫,web
    多进程用于计算密集型,如金融分析

以上是关于53_并发编程-线程-GIL锁的主要内容,如果未能解决你的问题,请参考以下文章

并发编程——GIL全局解释器锁死锁现象与递归锁信号量Event事件线程queue

10 并发编程-(线程)-GIL全局解释器锁&死锁与递归锁

Python并发编程05/ 死锁/递归锁/信号量/GIL锁/进程池/线程池

python 并发编程 多线程 GIL全局解释器锁基本概念

Python并发编程-线程锁

并发编程--一堆锁,GIL,同步异步,Event事件