百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术流 > 正文

多进程 VS 多线程:Python执行效率如何?IO和CPU告诉你

citgpt 2024-09-09 02:17 15 浏览 0 评论

大家在学习一门计算机语言,不可避免的要考虑到运行效率问题,例如爬取多个网页时,是否可以利用计算机多核,实现程序并发运行,再比如内存数据交换、文件的读写、或者网络通信,总会出现阻塞IO,是否可以通过增加进程,将阻塞状态变成非阻塞状态。

此时,多任务编程重要性就显现出来了,多任务编程就是充分利用计算机资源,同时运行多个任务,提高程序整体的运行效率,实现手段就是大家熟知的多进程和多线程操作,也就是所谓的并行和并发,并行就是多个计算机核心在同时处理多个任务,这时多个任务之间是并行关系,所占资源会比较多;而并发是指同时运行多个任务,一个内核在多个任务间不断切换,达到多个任务都会被执行的处理效果,此时多个任务间是并发关系。

多进程 VS 多线程:Python执行效率如何?IO和CPU告诉你

解释了并行和并发,就不难理解进程和线程了,进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础,而一个进程包含多个线程,线程也是一种多任务编程方式,可以使用计算机的多核资源,是计算机内核使用的最小单位,那python中的多进程和多线程谁的效率更高呢?小编用IO密集和CPU密集两种状态对单进程、多进程、多线程进行比较测试,下面直接撂代码。

首先是测试对象:IO密集和CPU密集实例,这里以200万次的“hello world”读写操作作为IO密集测试样例,以700万次累加操作作为CPU密集测试样例:

下面先进行单进程操作:

然后是多进程操作:

最后是多线程操作:

运行结果汇总如下:

根据结果可以看出,分别测试单进程、多进程、多线程执行相同的IO操作和cpu操作的时间,cpu消耗中:单进程为7.44s,多进程为4.04s,多线程为7.90s;在io消耗中,单进程为6.19s,多进程为2.94s,多线程为5.74s。无论是CPU(计算)密集型程序或是IO密集型程序,多进程并发优于多线程并发,并且在CPU(计算)密集型程序中,多线程比单进程效率还慢,在IO密集型程序中,多线程优势也不是很明显,究其原因,都绕不开Python的全局解释器锁的问题,即GIL问题。

但python的多线程并不是一无是处,对于高延迟和多阻塞的IO事件,可以像非阻塞IO一样,通过属性和超时检测发送错误,再通过捕捉错误跳过该阻塞IO,先并发其他IO事件,可以节省效率,在这方面python多线程的创建删除消耗的资源远小于多进程,大概是进程的1/20,因此到底选用多进程还是多线程时,小编为大家总结了以下经验:如果一个进程中并发任务比较多,比较简单,适合使用多线程;如果数据程序比较复杂,特别是可能多个任务通信比较多的时候,要考虑到使用线程同步互斥的复杂性;如果多个任务存在明显差异,和功能分离的时候,可以考虑使用多进程。

受制于水平的有限,这里只从IO密集和CPU密集两个方面对单进程、多进程和多线程进行了对比。需要交流和切磋的读者朋友,请在评论区积极留言,欢迎关注头条号:杜哥说python。

相关推荐

js中arguments详解

一、简介了解arguments这个对象之前先来认识一下javascript的一些功能:其实Javascript并没有重载函数的功能,但是Arguments对象能够模拟重载。Javascrip中每个函数...

firewall-cmd 常用命令

目录firewalldzone说明firewallzone内容说明firewall-cmd常用参数firewall-cmd常用命令常用命令 回到顶部firewalldzone...

epel-release 是什么

EPEL-release(ExtraPackagesforEnterpriseLinux)是一个软件仓库,它为企业级Linux发行版(如CentOS、RHEL等)提供额外的软件包。以下是关于E...

FullGC详解  什么是 JVM 的 GC
FullGC详解 什么是 JVM 的 GC

前言:背景:一、什么是JVM的GC?JVM(JavaVirtualMachine)。JVM是Java程序的虚拟机,是一种实现Java语言的解...

2024-10-26 08:50 citgpt

使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
跨域(CrossOrigin)

1.介绍  1)跨域问题:跨域问题是在网络中,当一个网络的运行脚本(通常时JavaScript)试图访问另一个网络的资源时,如果这两个网络的端口、协议和域名不一致时就会出现跨域问题。    通俗讲...

微服务架构和分布式架构的区别

1、含义不同微服务架构:微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并...

深入理解与应用CSS clip-path 属性
深入理解与应用CSS clip-path 属性

clip-pathclip-path是什么clip-path 是一个CSS属性,允许开发者创建一个剪切区域,从而决定元素的哪些部分可见,哪些部分会被隐...

2024-10-25 11:51 citgpt

HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
Request.ServerVariables 大全

Request.ServerVariables("Url")返回服务器地址Request.ServerVariables("Path_Info")客户端提供的路...

python操作Kafka

目录一、python操作kafka1.python使用kafka生产者2.python使用kafka消费者3.使用docker中的kafka二、python操作kafka细...

Runtime.getRuntime().exec详解

Runtime.getRuntime().exec详解概述Runtime.getRuntime().exec用于调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。...

promise.all详解 promise.all是干什么的
promise.all详解 promise.all是干什么的

promise.all详解promise.all中所有的请求成功了,走.then(),在.then()中能得到一个数组,数组中是每个请求resolve抛出的结果...

2024-10-24 16:21 citgpt

Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解

取消回复欢迎 发表评论: