• 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
        多进程用于计算密集型,如金融分析
  • 相关阅读:
    jqgrid 获取选中用户的数据插入
    jqgrid 自定义文本框、选择框等查询
    Java学习—— for循环
    Android中 Http请求
    异步消息处理机制——Handler用法
    ThreadLocal
    Android开发 学习笔记——HelloWorld
    eclipse 常用插件
    mysql 命令备份还原
    学习
  • 原文地址:https://www.cnblogs.com/hq82/p/9876087.html
Copyright © 2020-2023  润新知