打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
python并发编程:使用多进程multiprocessing模块加速程序的运行

往期文章:

  1. 并发编程简介
  2. 怎样选择多线程多进程多协程
  3. Python速度慢的罪魁祸首,全局解释器锁GIL
  4. 使用多线程,Python爬虫被加速10倍
  5. Python实现生产者消费者爬虫
  6. Python线程安全问题以及解决方案
  7. Python好用的线程池ThreadPoolExecutor
  8. 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, '秒')

运行结果如下:

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Python中的多进程与多线程:新手简介
很多人现在还不知道的知识点,Python多进程和多线程详解!
python入门系列:多进程
总算搞明白了!进程,线程,协程,生成器,迭代器搞的我脑子好乱!
Python爬虫(五)
熬了两个通宵写的!终于把多线程和多进程彻底讲明白了!
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服