往期文章:
- 并发编程简介
- 怎样选择多线程多进程多协程
- Python速度慢的罪魁祸首,全局解释器锁GIL
- 使用多线程,Python爬虫被加速10倍
- Python实现生产者消费者爬虫
- Python线程安全问题以及解决方案
- Python好用的线程池ThreadPoolExecutor
- Python使用线程池在Web服务中实现加速
有了多线程threading,为什么还要用多进程multiprocessing
如果遇到了CPU密集型计算,多线程反而会降低执行速度。mutilprocessing模块就是python为了解决GIL缺陷引入的一个模块,原理是用多进程在多CPU上并行执行。
上图的上面展示的是一个多线程执行的过程,主要通过并行IO和CPU来提高执行速度,但是对于CPU密集型运算,即上图的下面部分,一直都需CPU计算,则线程的切换耽误时间,导致多线程反而没有多线程速度快。
对比多线程和多进程的实现
代码演示
这里判断100个大数 是否为素数?分别对比了单线程,多线程,多进程的效率。
import math
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
import time
num_list = [112272535095293] * 100
def is_prime(num):
"""
判断是不是素数
"""
if num < 2:
return False
if num == 2:
return True
if num % 2 == 0:
return False
sqrt_n = int(math.floor(math.sqrt(num)))
for i in range(3,sqrt_n+1,2):
if num % i == 0:
return False
return True
# 单线程
def single_thread():
for num in num_list:
is_prime(num)
#多线程
def multi_thread():
with ThreadPoolExecutor() as pool:
pool.map(is_prime,num_list)
# 多进程
def multi_process():
with ProcessPoolExecutor() as pool:
pool.map(is_prime,num_list)
if __name__ == "__main__":
start = time.time()
single_thread()
end = time.time()
print('单线程:', end - start, '秒')
start = time.time()
multi_thread()
end = time.time()
print('多线程:', end - start, '秒')
start = time.time()
multi_process()
end = time.time()
print('多进程', end - start, '秒')
运行结果如下: