Python 多进程和多线程在加速程序运行上的差别

起因是在处理一个需要大量计算且批量生成文件的程序时,使用多线程的方法处理计算任务加速效果不理想,后来采用了多进程的方式加速效果很好,所以花点时间探究一下两者之间的区别。

目录

[1. 多线程(multi-thread)](#1. 多线程(multi-thread))

[2. 多进程(multi-processor)](#2. 多进程(multi-processor))

[3. 实例说明](#3. 实例说明)


1. 多线程(multi-thread)

因为受到python爬虫一类的程序影响,加速首先想到的是多线程。对于爬虫这种IO密集型的程序来说,确实是多线程在加速方面有更好的表现。IO密集型指的是系统运作大部分的情况是CPU在等 I/O(硬盘/内存/网络等等)的读/写操作,这时候CPU的占用率是非常低的(这也是多进程加速表现不明显的原因)。多线程实现的本质是cpu的并发执行 ,并发执行其实就是cpu轮流执行不同的任务。对于IO密集型,CPU占用率低,一个任务执行后需要CPU一直等待,如果使用多线程对程序进行并发执行,那么CPU在原本等待的时间就可以执行其他任务,进而加速程序的执行。

2. 多进程(multi-process)

如果一个任务IO的占用时间很少,但CPU的占用率非常高,那么就不适合用多线程来加速了(甚至可能让程序变得更慢)。多进程在这种任务上的加速效果就非常明显,本质上是CPU的并行执行 。并行执行主要是利用CPU的多个核心处理器,如果CPU只有单核,那么则无法并行执行。可以理解成,对于CPU密集型,多进程调用CPU的多个核心处理器,同时处理计算任务,加快程序的执行。

3. 实例说明

cpp 复制代码
import time
import threading
from multiprocessing import Process, Pool

def calculation(n):
    for i in range(0, n):
        for j in range(0, n*n):
            t = i*j


def thread():
    t = threading.Thread(target=calculation, args=(1000,))
    start = time.time()
    t.start()
    t.join()
    
    print("multi thread time consumption: ", time.time() - start, 's')


def process():
    
    p = Pool(12)
    for i in range(0,12):
        p.apply_async(calculation, args=(1000))
   
    start = time.time()
    p.close()
    p.join()
    
    print("multi process time consumption: ", time.time() - start, 's')
    
    
if __name__=='__main__':
    thread()
    process()

运行的结果如下:

cpp 复制代码
multi thread time consumption:  19.517925024032593 s
multi process time consumption:  0.017050981521606445 s

发现,对于cpu密集型的任务,多进程的加速效果要远好于多线程。当然,上述两层循环的计算任务的设置,是特别设计适用于多进程加速的。这涉及到并行和并发的深入理解,后面有时间再做详细的总结。

相关推荐
信誓旦旦的程序猿10 小时前
【Python量化实战宝典 #21】北向资金跟随手册:聪明钱择时信号(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
严谨的麻辣烫10 小时前
静态 ISP 代理请求超时怎么排查?Python 与 curl 实战
python·http·requests·1024程序员节·网络排障
下一站春风里10 小时前
位运算完整学习笔记:按位与(&)+ 异或(^)
开发语言·c++·算法
天外飞雨道沧桑11 小时前
我在浏览器里练了一个 792 参数的大模型,它学会了补全 JavaScript
开发语言·javascript·ai·ecmascript·ai编程
hhhjhl11 小时前
Yup 跨端三方库仓颉适配全流程
java·开发语言
运维行者_11 小时前
网络监控工具怎么选?从设备监控到智能运维的能力清单
运维·服务器·开发语言·网络·人工智能·支持向量机·php
KeepRobots12 小时前
11-01 温哥华不回拨:用 60 行 Python 查你的工单系统会不会差一小时(KeepRobots 工程笔记)
python
xiao77mwq12 小时前
你以为 OCR 慢?实测 81.3 s 里全是故障代价:如何把「定格态」消掉,让耗时从 6.5 s 到 13 倍差距显出原形
python
深圳市益普科技有限公司12 小时前
半导体良率管理YMS:良率与设备参数的相关性,先拉哪几组数据
人工智能·python·算法
“AI国潮设计-小江”12 小时前
【AIGC实战】Python+SDXL打造“潮汕英歌舞IP”万能立牌插件,批量生成“发财元宝蛋糕”视觉营销方案(附源码)
开发语言·人工智能·python·prompt·aigc