python多线程性能(为什么python多线程这么慢)

2024-07-05 01:38:24 34

python多线程性能(为什么python多线程这么慢)

本文目录

为什么python多线程这么慢

差不多是这样子。多线程目前仅用于网络多线程采集, 以及性能测试。 其它的语言也有类似的情况,线程本身的特点导致线程的适用范围是受限的。只有CPU过剩,而其它的任务很慢,此时用线程才是有益的,可以很好平衡等待时间,提高并发性能。线程的问题主要是线程的安全稳定性。线程无法强制中止,同时线程与主进程共享内存,可能会影响主进程的内存管理。 在python里线程出问题,可能会导致主进程崩溃。 虽然python里的线程是操作系统的真实线程。那么怎么解决呢?通过我们用进程方式。子进程崩溃后,会完全的释放所有的内存和错误状态。所以进程更安全。 另外通过进程,python可以很好的绕过GIL,这个全局锁问题。 但是进程也是有局限的。不要建立超过CPU总核数的进程,否则效率也不高。 简单的总结一下。当我们想实现多任务处理时,首先要想到使用multiprocessing, 但是如果觉着进程太笨重,那么就要考虑使用线程。 如果多任务处理中需要处理的太多了,可以考虑多进程,每个进程再采用多线程。如果还处理不要,就要使用轮询模式,比如使用poll event, twisted等方式。如果是GUI方式,则要通过事件机制,或者是消息机制处理,GUI使用单线程。所以在python里线程不要盲目用, 也不要滥用。 但是线程不安全是事实。如果仅仅是做几个后台任务,则可以考虑使用守护线程做。如果需要做一些危险操作,可能会崩溃的,就用子进程去做。 如果需要高度稳定性,同时并发数又不高的服务。则强烈建议用多进程的multiprocessing模块实现。在linux或者是unix里,进程的使用代价没有windows高。还是可以接受的。

python多线程能提高效率吗

  • 如果你的代码是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,是使用多进程实现了concurrencyfrom multiprocessing import Pool如果把这个代码改成下面这样,就变成多线程实现concurrencyfrom multiprocessing.dummy import Pool两种方式都跑一下,哪个速度快用哪个就行了。UPDATE:刚刚才发现concurrent.futures这个东西,包含ThreadPoolExecutor和ProcessPoolExecutor,可能比multiprocessing更简单

Python 多线程效率不高吗

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

Python 的 GIL 是什么鬼,多线程性能究竟如何

GIL是什么首先需要明确的一点是 GIL 并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码。有名的编译器例如GCC,INTEL C++,Visual C++等。Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行。像其中的JPython就没有GIL。然而因为CPython是大部分环境下默认的Python执行环境。所以在很多人的概念里CPython就是Python,也就想当然的把 GIL 归结为Python语言的缺陷。所以这里要先明确一点:GIL并不是Python的特性,Python完全可以不依赖于GIL那么CPython实现中的GIL又是什么呢?GIL全称 Global Interpreter Lock 为了避免误导,我们还是来看一下官方给出的解释:In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.)好吧,是不是看上去很糟糕?一个防止多线程并发执行机器码的一个Mutex,乍一看就是个BUG般存在的全局锁嘛!别急,我们下面慢慢的分析。为什么会有GIL由于物理上得限制,各CPU厂商在核心频率上的比赛已经被多核所取代。为了更有效的利用多核处理器的性能,就出现了多线程的编程方式,而随之带来的就是线程间数据一致性和状态同步的困难。 即使在CPU内部的Cache也不例外 ,为了有效解决多份缓存之间的数据同步时各厂商花费了不少心思,也不可避免的带来了一定的性能损失。Python当然也逃不开,为了利用多核,Python开始支持多线程。 而解决多线程之间数据完整性和状态同步的最简单方法自然就是加锁。 于是有了GIL这把超级大锁,而当越来越多的代码库开发者接受了这种设定后,他们开始大量依赖这种特性(即默认python内部对象是thread-safe的,无需在实现时考虑额外的内存锁和同步操作)。慢慢的这种实现方式被发现是蛋疼且低效的。但当大家试图去拆分和去除GIL的时候,发现大量库代码开发者已经重度依赖GIL而非常难以去除了。有多难?做个类比,像MySQL这样的“小项目”为了把Buffer Pool Mutex这把大锁拆分成各个小锁也花了从5.5到5.6再到5.7多个大版为期近5年的时间,本且仍在继续。MySQL这个背后有公司支持且有固定开发团队的产品走的如此艰难,那又更何况Python这样核心开发和代码贡献者高度社区化的团队呢?所以简单的说GIL的存在更多的是历史原因。如果推到重来,多线程的问题依然还是要面对,但是至少会比目前GIL这种方式会更优雅。GIL的影响从上文的介绍和官方的定义来看,GIL无疑就是一把全局排他锁。毫无疑问全局锁的存在会对多线程的效率有不小影响。甚至就几乎等于Python是个单线程的程序。那么读者就会说了,全局锁只要释放的勤快效率也不会差啊。只要在进行耗时的IO操作的时候,能释放GIL,这样也还是可以提升运行效率的嘛。或者说再差也不会比单线程的效率差吧。理论上是这样,而实际上呢?Python比你想的更糟。下面我们就对比下Python在多线程和单线程下得效率对比。测试方法很简单,一个循环1亿次的计数器函数。一个通过单线程执行两次,一个多线程执行。最后比较执行总时间。测试环境为双核的Mac pro。注:为了减少线程库本身性能损耗对测试结果带来的影响,这里单线程的代码同样使用了线程。只是顺序的执行两次,模拟单线程。顺序执行的单线程(single_thread.py)#! /usr/bin/pythonfrom threading import Threadimport timedef my_counter():i = 0for _ in range(100000000):i = i + 1return Truedef main():thread_array = {}start_time = time.time()for tid in range(2):t = Thread(target=my_counter)t.start()thread_array = tfor i in range(2):thread_array.join()end_time = time.time()print("Total time: {}".format(end_time - start_time))if __name__ == ’__main__’:main()同时执行的两个并发线程(multi_thread.py)#! /usr/bin/pythonfrom threading import Threadimport timedef my_counter():i = 0for _ in range(100000000):i = i + 1return Truedef main():thread_array = {}start_time = time.time()for tid in range(2):t = Thread(target=my_counter)t.start()thread_array = tfor i in range(2):thread_array.join()end_time = time.time()print("Total time: {}".format(end_time - start_time))if __name__ == ’__main__’:main()

python多线程性能(为什么python多线程这么慢)

本文编辑:admin

本文相关文章:


python多线程性能(Python 的 GIL 是什么鬼,多线程性能究竟如何)

python多线程性能(Python 的 GIL 是什么鬼,多线程性能究竟如何)

大家好,python多线程性能相信很多的网友都不是很明白,包括Python 的 GIL 是什么鬼,多线程性能究竟如何也是一样,不过没有关系,接下来就来为大家分享关于python多线程性能和Python 的 GIL 是什么鬼,多线程性能究竟如

2024年8月4日 13:20

更多文章:


文本框无轮廓怎么设置(word中文本框怎么设置无边框)

文本框无轮廓怎么设置(word中文本框怎么设置无边框)

本文目录word中文本框怎么设置无边框Word中如何设置文本轮廓word填充效果为黄色无轮廓word无轮廓选中之后,轮廓还显示word中文本框怎么设置无边框 在工作上总会要使用到word办公软件,那word中文本框怎么设置无边框的呢,

2024年6月20日 04:12

sql2000服务器配置(如何在服务器上设置SQL SERVER2000)

sql2000服务器配置(如何在服务器上设置SQL SERVER2000)

本篇文章给大家谈谈sql2000服务器配置,以及如何在服务器上设置SQL SERVER2000对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目

2024年7月18日 04:35

wps表格文本框的边框怎么去掉(文本框边框怎么去掉)

wps表格文本框的边框怎么去掉(文本框边框怎么去掉)

“wps表格文本框的边框怎么去掉”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看wps表格文本框的边框怎么去掉(文本框边框怎么去掉)!本文目录文本框边框怎么去掉怎样去掉WPS文档的文本框 只要文字 打印是不显示文本框就行wp

2024年9月6日 11:50

什么是磁盘配额 磁盘配额有什么用?win10电脑怎么进行设置磁盘配额

什么是磁盘配额 磁盘配额有什么用?win10电脑怎么进行设置磁盘配额

本文目录什么是磁盘配额 磁盘配额有什么用win10电脑怎么进行设置磁盘配额怎么给电脑硬盘配额啊磁盘配额管理是什么意思什么是磁盘配额,有何作用什么是磁盘配额使用磁盘配额应注意哪些情况磁盘配额是什么意思怎么设置 磁盘配额Win8系统磁盘配额功能

2024年7月2日 03:10

scapy安装(Linux下scapy运行时报错:No module named scapy)

scapy安装(Linux下scapy运行时报错:No module named scapy)

本文目录Linux下scapy运行时报错:No module named scapypython3 scapy 安装失败Linux下scapy运行时报错:No module named scapy Kali 是自带有 scapy 的,在

2024年7月1日 23:26

intensity是什么意思(Light Intensity 是什么意思,是什么计量单位)

intensity是什么意思(Light Intensity 是什么意思,是什么计量单位)

本文目录Light Intensity 是什么意思,是什么计量单位intensity+inhomogeneity是什么意思Glow Intensity是什么意思intensity是什么意思intensity与binding+energy构成

2024年7月12日 06:09

mongodb云数据库(紫光云数据库MongoDB版有哪些功能优势啊)

mongodb云数据库(紫光云数据库MongoDB版有哪些功能优势啊)

这篇文章给大家聊聊关于mongodb云数据库,以及紫光云数据库MongoDB版有哪些功能优势啊对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录紫光云数据库MongoDB版有哪些功能优势啊如何通过公网访问MongoDB云数据库紫

2024年7月18日 00:50

password翻译中文(Password中文是什么意思)

password翻译中文(Password中文是什么意思)

“password翻译中文”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看password翻译中文(Password中文是什么意思)!本文目录Password中文是什么意思Password是什么意思password是啥意思英

2024年8月31日 20:20

递归算法是运算最快的算法吗(六、递归与回溯算法)

递归算法是运算最快的算法吗(六、递归与回溯算法)

大家好,如果您还对递归算法是运算最快的算法吗不太了解,没有关系,今天就由本站为大家分享递归算法是运算最快的算法吗的知识,包括六、递归与回溯算法的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录六、递归与回溯算法递归和

2024年7月21日 19:00

accept中文(accept的中文是什么意思)

accept中文(accept的中文是什么意思)

本文目录accept的中文是什么意思I’ve accepted your friend request. Now let’s chat!中文意思“accept”的汉语意思是什么初二英语选择题accept的中文是什么意思accept 英

2024年7月14日 00:13

maven是什么工具(gradle比maven好为什么用的人少)

maven是什么工具(gradle比maven好为什么用的人少)

本文目录gradle比maven好为什么用的人少俗话来讲什么是maven什么是jenkins两者的区别是什么各位是如何解决maven包依赖冲突或有什么检测插件推荐如何构建一个基于Maven的Java项目Java具体是做什么的gradle比m

2023年9月17日 22:00

mysql修改root密码的4种方法(mysql怎么更改root密码)

mysql修改root密码的4种方法(mysql怎么更改root密码)

大家好,关于mysql修改root密码的4种方法很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于mysql怎么更改root密码的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对

2024年7月8日 23:50

sleep延时函数怎么用(C#中如何使用Sleep)

sleep延时函数怎么用(C#中如何使用Sleep)

本文目录C#中如何使用SleepVB 中如何使用延时函数时钟回调里怎么设置sleepC#中如何使用SleepThread.Sleep 函数来使线程挂起一段时间.在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度

2024年5月10日 05:28

我的个人主页收藏(抖音的收藏怎么删除)

我的个人主页收藏(抖音的收藏怎么删除)

大家好,如果您还对我的个人主页收藏不太了解,没有关系,今天就由本站为大家分享我的个人主页收藏的知识,包括抖音的收藏怎么删除的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录抖音的收藏怎么删除微博里的收藏在哪里抖音收藏

2024年7月28日 11:20

xmlelement注解(使用dom4j解析xml文件时,element对象的什么方法用来获取节点属性)

xmlelement注解(使用dom4j解析xml文件时,element对象的什么方法用来获取节点属性)

本文目录使用dom4j解析xml文件时,element对象的什么方法用来获取节点属性java中 xmlelement 什么意思使用dom4j解析xml文件时,element对象的什么方法用来获取节点属性假设有个属性nameElement e

2024年7月19日 13:50

javatostring方法的作用(java中的toString()是什么方法)

javatostring方法的作用(java中的toString()是什么方法)

各位老铁们好,相信很多人对javatostring方法的作用都不是特别的了解,因此呢,今天就来为大家分享下关于javatostring方法的作用以及java中的toString()是什么方法的问题知识,还望可以帮助大家,解决大家的一些困惑,

2024年7月10日 04:40

react小程序开发框架有哪些(有没有大佬做过移动跨平台框架的对比,h5 rn weex flutter,性能方面)

react小程序开发框架有哪些(有没有大佬做过移动跨平台框架的对比,h5 rn weex flutter,性能方面)

本文目录有没有大佬做过移动跨平台框架的对比,h5 rn weex flutter,性能方面web前端动态网页开发主流技术有哪些有没有大佬做过移动跨平台框架的对比,h5 rn weex flutter,性能方面推荐:uni-appuni-ap

2024年7月24日 12:39

138ip地址查询(如何检查自己的网络类型)

138ip地址查询(如何检查自己的网络类型)

本文目录如何检查自己的网络类型请问我的网络IP地址到底是什么电信还是联通如何查询服务器提供商http://www.ip138.com/ 这个ip地址查询系统是怎么做的呢如何检查自己的网络类型1、电脑打开百度搜索引擎。2、打开百度搜索引

2024年5月7日 18:16

直流开关电源(给开关电源一个直流电,开关电源还能稳定工作吗)

直流开关电源(给开关电源一个直流电,开关电源还能稳定工作吗)

本文目录给开关电源一个直流电,开关电源还能稳定工作吗什么是直流电源什么是交流电源开关直流电源与线性电源的区别感性负载电压配直流电源开关好吗直流稳压开关电源和线性电源的区别开关电源有哪些类型-开关电源的主要类型直流开关电源原理是什么低压直流开

2024年7月19日 04:36

borderradius兼容(请问好人们,小程序swiper设了overflow:hidden和border-radius:10rpx,在ios手机上没效果,解决方案)

borderradius兼容(请问好人们,小程序swiper设了overflow:hidden和border-radius:10rpx,在ios手机上没效果,解决方案)

本文目录请问好人们,小程序swiper设了overflow:hidden和border-radius:10rpx,在ios手机上没效果,解决方案不支持的属性: zoom;inline-block;border-radius 求解决啊~~cs

2024年4月17日 14:45

近期文章

本站热文

iphone vpn设置(ios设置vpn快捷开关)
2024-07-22 15:01:12 浏览:2334
windows12正式版下载(操作系统Windows Server 2012 R2,在哪能下载到,公司用的)
2024-07-20 17:26:53 浏览:1731
java安装教程(win10如何安装JAVA)
2024-07-19 19:55:49 浏览:1156
client mfc application未响应(每次进cf就提示client MFC Application未响应该怎么办啊!急急急)
2024-07-20 11:15:58 浏览:1152
标签列表

热门搜索