GIL全局解释器锁

夙愿已清 提交于 2019-11-27 08:09:13
"""
In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple
native threads from executing Python bytecodes at once. This lock is necessary mainly
because CPython’s memory management is not thread-safe.
"""
'''
ps:python解释器有很多种,最常见的就是CPython解释器
GIL本质就是一把互斥锁:将并发变成串行牺牲效率保证数据安全
用来阻止同一个进程下的多个线程的同时执行(同一个进程内多个线程无法实现并行,但能并发

GIL的存在就是因为CPython解释器的内存管理不是线程安全的
    为什么不安全呢?
        在Python解释器中有一个垃圾回收机制,那也是一串代码,也是一个进程,
        在并行时,可能会造成一个问题,其他线程变量名还没有赋值时,垃圾回收机制就将值回收了
        就会造成变量名找不到值
        所以需要并发

垃圾回收机制
    1.引用计数
    2.标记清除
    3.分代回收
    
研究python的多线程是否有用需要分情况讨论
四个任务 计算密集型的 10s
单核情况下
    开线程更省资源
多核情况下
    开进程 10s
    开线程 40s
    
四个任务 IO密集型的
单核情况下
    开线程更省资源
多核情况下
    开线程更省资源    

'''
# 计算密集型
# from multiprocessing import Process
# from threading import Thread
# import os
# import time
# def work():
#     res = 1
#     for i in range(100000000):
#         res *= i
#
#
# if __name__ == '__main__':
#     l = []
#     print(os.cpu_count())  # 4核
#     start_time = time.time()
#
#     for i in range(4):
#         p = Process(target=work)  # 耗时10.977932214736938秒
#         # p = Thread(target=work)  # 耗时22.046306133270264秒
#         l.append(p)
#         p.start()
#     for i in l:
#         i.join()
#     print(time.time() - start_time)


# IO密集型
from multiprocessing import Process
from threading import Thread
import time
import os


def work():
    time.sleep(3)


if __name__ == '__main__':
    l = []
    print(os.cpu_count())  # 本机4核 本机再算计算密集型就炸了
    start_time = time.time()
    for i in range(400):
        p = Process(target=work)  # 耗时36.039791107177734 大部分时间浪费在开辟内存中间上
        # p = Thread(target=work)  # 耗时3.0542681217193604秒
        l.append(p)
        p.start()
    for p in l:
        p.join()
    print(time.time() - start_time)

'''
pythyon的多线程到底有没有用
需要分情况讨论
在计算密集型上python处于弱势,但在IO密集型上Python还是很强的

我们以后会用到多进程+多线程配合使用
'''

'''
在开始我们也提到过GIL全局解释器锁本质就是一把互斥锁
    有些人就会认为有了GIL锁之后,我们在处理数据时,就不用加互斥锁了,
    实则不然,GIL全局解释器锁遇到IO时.cpu就会剥夺其使用权限,去执行其他的线程
    我们在处理数据时,就会遇到IO操作(比如网络延迟)所以我们需要使用到普通互斥锁,保证数据安全
'''

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!