python多线程io(python多线程io慢)

  • 1、Python 多线程效率不高吗?
  • 2、python 什么情况下该用多线程什么情况下不该用
  • 3、python多线程能提高效率吗
  • 4、Python多线程是什么意思?
  • 5、Python高阶(一) – 单线程、多线程和多进程的效率对比测试

Python效率到底高不高?到底是不是鸡肋?Python由于有全锁局的存在(同一时间只能有一个线程执行),并不能利用多核优势。所以,如果你的多线程进程是CPU密集型的,那多线程并不能带来效率上的提升,相反还可能会因为线程的频繁切换,导致效率下降;如果是IO密集型,多线程进程可以利用IO阻塞等待时的空闲时间执行其他线程,提升效率。

多线程,是指从软件或者硬件上实现多个线程并发执行的技术。想要了解不同的线程是怎样运作的,要知道不同线程同时访问资源时,需要使用保护机制,Python中使用GIL(解释器全局锁)。直观上,这是一个加在解释器上的全局(从解释器的角度看)锁。这意味着对于任何Python程序,不管有多少的处理器,任何时候都总是只有一个线程在执行。所以,如果没有IO操作,python中的多线程比单线程效率还低。

根据我同学的说法,如果你只是想做个定时器样的简单东西,对稳定性要求低些,如vb,c#类似的定时器,用多线程吧,但线程的同步要注意了。python的线程更加类似定时器,python的线程不是真线程,但有的场合用这种定时器也能解决很多问题,因为开销小,开启也方便。但是如果你不是这种想法,你可能很难理解。

虽然CPython的线程库直接封装了系统的原生线程,但CPython整体作为一个进程,同一时间只会有一个获得GIL的线程在跑,其他线程则处于等待状态。这就造成了即使在多核CPU中,多线程也只是做着分时切换而已。

python的多线程建议在IO密集的情况下使用,反过来说如果是CPU密集的情况下就不建议使用多线程了,这个时候就需要使用多进程

如果你的代码是CPU密集型,多个线程的代码很有可能是线性执行的。所以这种情况下多线程是鸡肋,效率可能还不如单线程因为有context switch

但是:如果你的代码是IO密集型,多线程可以明显提高效率。例如制作爬虫(我就不明白为什么Python总和爬虫联系在一起…不过也只想起来这个例子…),绝大多数时间爬虫是在等待socket返回数据。这个时候C代码里是有release GIL的,最终结果是某个线程等待IO的时候其他线程可以继续执行。

反过来讲:你就不应该用Python写CPU密集型的代码…效率摆在那里…

如果确实需要在CPU密集型的代码里用concurrent,就去用multiprocessing库。这个库是基于multi process实现了类multi thread的API接口,并且用pickle部分地实现了变量共享。

再加一条,如果你不知道你的代码到底算CPU密集型还是IO密集型,教你个方法:

multiprocessing这个module有一个dummy的sub module,它是基于multithread实现了multiprocessing的API。

假设你使用的是multiprocessing的Pool,是使用多进程实现了concurrency

from multiprocessing import Pool

如果把这个代码改成下面这样,就变成多线程实现concurrency

from multiprocessing.dummy import Pool

两种方式都跑一下,哪个速度快用哪个就行了。

UPDATE:

刚刚才发现concurrent.futures这个东西,包含ThreadPoolExecutor和ProcessPoolExecutor,可能比multiprocessing更简单

简单地说就是作为可能是仅有的支持多线程的解释型语言(perl的多线程是残疾,PHP没有多线程),Python的多线程是有compromise的,在任意时间只有一个Python解释器在解释Python bytecode。

UPDATE:如评论指出,Ruby也是有thread支持的,而且至少Ruby MRI是有GIL的。

如果你的代码是CPU密集型,多个线程的代码很有可能是线性执行的。所以这种情况下多线程是鸡肋,效率可能还不如单线程因为有context switch

但是:如果你的代码是IO密集型,多线程可以明显提高效率。例如制作爬虫(我就不明白为什么Python总和爬虫联系在一起…不过也只想起来这个例子…),绝大多数时间爬虫是在等待socket返回数据。这个时候C代码里是有release GIL的,最终结果是某个线程等待IO的时候其他线程可以继续执行。

反过来讲:你就不应该用Python写CPU密集型的代码…效率摆在那里…

如果确实需要在CPU密集型的代码里用concurrent,就去用multiprocessing库。这个库是基于multi process实现了类multi thread的API接口,并且用pickle部分地实现了变量共享。

再加一条,如果你不知道你的代码到底算CPU密集型还是IO密集型,教你个方法:

multiprocessing这个module有一个dummy的sub module,它是基于multithread实现了multiprocessing的API。

假设你使用的是multiprocessing的Pool,是使用多进程实现了concurrency

from multiprocessing import Pool

如果把这个代码改成下面这样,就变成多线程实现concurrency

from multiprocessing.dummy import Pool

两种方式都跑一下,哪个速度快用哪个就行了。

UPDATE:

刚刚才发现concurrent.futures这个东西,包含ThreadPoolExecutor和ProcessPoolExecutor,可能比multiprocessing更简单

多线程的目的 – “最大限度地利用CPU资源”。每个程序执行时都会产生一个进程,而每一个进程至少要有一个主线程。对于单CPU来说(没有开启超线程),在同一时间只能执行一个线程,所以如果想实现多任务,那么就只能每个进程或线程获得一个时间片,在某个时间片内,只能一个线程执行,然后按照某种策略换其他线程执行。由于时间片很短,这样给用户的感觉是同时有好多线程在执行。

Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多线程(Thread)的情况下,不能发挥多核的优势。而使用多进程(Multiprocess),则可以发挥多核的优势真正地提高效率。

单线程、多线程和多进程的效率对比测试: github地址

资料显示,如果多线程的进程是CPU密集型的,那多线程并不能有多少效率上的提升,相反还可能会因为线程的频繁切换,导致效率下降,推荐使用多进程;如果是IO密集型,多线程进程可以利用IO阻塞等待时的空闲时间执行其他线程,提升效率。所以我们根据实验对比不同场景的效率

| CPU密集型操作| IO密集型操作| 网络请求密集型操作

— | — | –| —

线性操作| 69.73533328374 |17.76633326213 | 6.78833333651

多线程操作| 75.40299995740 |145.68366670609 | 1.93999997775

多进程操作| 13.97433336576 | 4.67833328247| 2.38333328565

仅个人观点,,欢迎留言~~~

原创文章,作者:简单一点,如若转载,请注明出处:https://www.506064.com/n/126883.html

汽车小知识 小米SU7 今日油价 油耗计算器 电耗计算器 购置税计算器 贷款计算器 保险计算器 交通违章代码 体育新闻
(0)
简单一点的头像简单一点
上一篇 2024-10-03 23:13
下一篇 2024-10-03 23:13

相关推荐

  • 包含phpaccessutf8的词条

    本文目录一览: 1、php access以中文作为参数进行数据查询时出现乱码. 2、PHP用pdo连接ACCESS读取会乱码,怎么设置编码 3、关于PHP+ACCESS数据插入 4…

    编程 2024-10-04
  • Python Anchors定义及用法详解

    对于Web应用程序的开发人员来说,HTML锚点是非常重要的部分,它们是用来通过页面内部链接到其他部分或跳转到其他页面的链接。Python作为一个广泛使用的编程语言,为开发人员提供了…

    编程 2024-11-10
  • Python生成随机数

    一、从matlab生成随机数 Matlab是一种用于数学计算、数据处理和图形绘制的高级技术计算语言和交互式环境。Matlab中生成均匀分布和正态分布的随机数。 import mat…

    编程 2024-10-03
  • postbody的全面解析

    一、postbody的定义 在Web开发中,postbody是指HTTP请求中的消息体,主要用于传递额外的数据信息。在POST请求中,postbody中存储的参数是被编码后的表单参…

    编程 2024-10-03
  • js比css先加载,css会阻塞js加载吗

    本文目录一览: 1、页面中css和js先执行谁 2、页面加载 css 和js 哪个先加载 顺序如何 可不可以跟据浏览器不同后期通过js加载css和不同的js 3、打开一个网站,加载…

    编程 2024-11-04
  • 使用web技术作为python的简单介绍

    本文目录一览: 1、用Python进行web开发需要学习什么? 2、如何用Python做Web开发? 3、python WEB后端开发技术的疑惑 4、python做web开发好吗 …

    编程 2024-10-03
  • CA认证是什么意思

    在全球信息化的背景下,电子商务已经成为我们生活中不可或缺的一部分,但是网络安全问题也在这个过程中逐渐凸显。于是数字证书这个技术就应运而生,而CA认证作为一种数字证书认证体系也越来越…

    编程 2024-10-25
  • 关于python存储图片的格式文件的信息

    本文目录一览: 1、python如何保存img文件 2、python如何保存图片 3、python保存图层设置 4、为什么用python保存图片为0K 5、如何用python绘制一…

    编程 2024-10-03
  • 现在java做什么最好(现在java做什么最好)

    1、学Java以后可以做什么? 2、学了JAVA可以做什么? 3、学Java不知道将来能做哪些工作? 学java可以去做1、企业应用开发:由于Java的安全性,很多企业会使用Jav…

    编程 2024-10-03
  • Pyperclip的全面介绍

    一、安装与导入 Pyperclip是一个方便使用的Python模块,用于在剪贴板/粘贴板上操作文本。在使用之前需要先安装。 首先,打开命令提示符或终端,输入以下命令来安装Pyper…

    编程 2024-10-03

发表回复

登录后才能评论