-
计算密集型
主要占用CPU资源
-
IO密集型
IO就是Input output,需要等待一些任务 网络请求会有网络延迟 和数据库交互需要等待数据库查询事件 读写硬盘
-
多进程在处理计算密集型程序的时候比多线程快
由于全局解释器锁的存在,一个进程下,只允许一个线程执行python程序的字节码(当前代码的二进制表示)。 简单的说,创建的10个线程其实在争夺一个cpu资源,但是遇到IO操作会读CPU资源。
-
如何绕过GIL?
将多线程方法改为多进程 将计算密集型任务转移给C扩展。 分布式计算引擎spark,Apache 使用PyPy解释器,工业上几乎没人这么用,因为PyPy并不成熟。
代码:
import time
import requests
from multiprocessing import Process
result = []
print(f"主进程result内存地址:{id(result)}")
def request_baidu(index):
time.sleep(2)
url = "https://www.baidu.com/"
body = ""
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36 Edg/101.0.1210.53"
}
response = requests.get(url=url,headers=headers)
print(f"当前请求序号:{index},返回结果状态码:{response.status_code}")
print(f"子进程result内存地址:{id(result)}")
result.append(response)
if __name__ == '__main__':
process_array = []
for i in range(10):
p = Process(target=request_baidu,args= (i, ))
process_array.append(p)
p.start()
for p in process_array:
p.join()
print("done!")
打印结果: