"""
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操作(比如网络延迟)所以我们需要使用到普通互斥锁,保证数据安全
'''
