⑴ python 多线程效率不高吗
Python由于有全锁局的存在(同一时间只能有一个线程执行),并不能利用多核优势。所以,如果你的多线程进程是CPU密集型的,那多线程并不能带来效率上的提升,相反还可能会因为线程的频繁切换,导致效率下降;如果是IO密集型,多线程进程可以利用IO阻塞等待时的空闲时间执行其他线程,提升效率。
⑵ Python高阶(一) - 单线程、多线程和多进程的效率对比测试
多线程的目的 - “最大限度地利用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
仅个人观点,,欢迎留言~~~
⑶ python多线程能提高效率吗
很多爬虫工作者都遇到过抓取速度非常慢,现在的大多数网站都具备了反爬虫技术,对IP的访问频率限制很严格。如果想提升爬虫的速度,大家可以尝试以下方法。
一、尽量减少访问次数。
单次爬虫任务的大多耗时在网络请求等待响应,所以能减少网络请求就尽量减少请求,这样既能减少目标网站的压力,也能减少代理服务器的压力,提高工作效率。
二、精简流程,减少重复。
大部分网站并不是严格意义上的树状结构,而是多重交叉的网状结构,所以从多个入口深入的网页会有很多重复,一般根据URL或者ID进行唯一性判别,爬过的就不需要再爬。一些数据如果可以在一个页面内获取到,也可以在多个页面下获取到,那就选择只在一个页面内获取。
三、多线程任务。
大量爬虫是一个IO阻塞的任务,所以采用多线程的并发方式可以有效地提高整体速度。多线程可以更好地提高资源利用率,程序设计也更加坚定,程序响应也更快。
四、分布式任务。
上面三点都做到极致了,但是单机单位时间内能爬取到的网页数量还不足以达到目标,在指定时间内还不能及时的完成任务,那么就只能多机器来同时进行爬虫任务了,这就是分布式爬虫。
做好以上几点,基本可以将爬虫的效率提升大半,另外爬虫代理ip也是不可缺少的尤其是对于量大的任务,IPIDEA提供全球ip的同时更注重保护数据的安全,也可以减少反爬虫策略的触发,一举多得。
⑷ 关于python多进程使用(Queue、生产者和消费者)
关于 的生产者和消费者的实现,刚好最近有用到,简单总结记录下:
是系统独立调度核分配系统资源(CPU、内存)的基本单位,进程之间是相互独立的,每启动一个新的进程相当于把数据进行了一次克隆。
python提供了多种方法实现了多进程中间的 (可以修改同一份数据)。
GIL 的全称是 Global Interpreter Lock(全局解释器锁),来源是 Python 设计之初的考虑,为了数据安全所做的决定。
某个线程想要执行,必须先拿到 GIL,我们可以把 GIL 看作是“通行证”,并且在一个 Python 进程中,GIL 只有一个,这就导致了多线程抢占GIL耗时。这就是为什么在多核CPU上,Python 的多线程效率并不高的根本原因。
所以有必要学习下多进程的使用。
⑸ 为什么python多线程这么慢
差不多是这样子。多线程目前仅用于网络多线程采集, 以及性能测试。
其它的语言也有类似的情况,线程本身的特点导致线程的适用范围是受限的。只有CPU过剩,而其它的任务很慢,此时用线程才是有益的,可以很好平衡等待时间,提高并发性能。
线程的问题主要是线程的安全稳定性。线程无法强制中止,同时线程与主进程共享内存,可能会影响主进程的内存管理。
在python里线程出问题,可能会导致主进程崩溃。 虽然python里的线程是操作系统的真实线程。
那么怎么解决呢?通过我们用进程方式。子进程崩溃后,会完全的释放所有的内存和错误状态。所以进程更安全。 另外通过进程,python可以很好的绕过GIL,这个全局锁问题。
但是进程也是有局限的。不要建立超过CPU总核数的进程,否则效率也不高。
简单的总结一下。
当我们想实现多任务处理时,首先要想到使用multiprocessing, 但是如果觉着进程太笨重,那么就要考虑使用线程。 如果多任务处理中需要处理的太多了,可以考虑多进程,每个进程再采用多线程。如果还处理不要,就要使用轮询模式,比如使用poll event, twisted等方式。如果是GUI方式,则要通过事件机制,或者是消息机制处理,GUI使用单线程。
所以在python里线程不要盲目用, 也不要滥用。 但是线程不安全是事实。如果仅仅是做几个后台任务,则可以考虑使用守护线程做。如果需要做一些危险操作,可能会崩溃的,就用子进程去做。 如果需要高度稳定性,同时并发数又不高的服务。则强烈建议用多进程的multiprocessing模块实现。
在linux或者是unix里,进程的使用代价没有windows高。还是可以接受的。
⑹ 你好大神就单纯的易语言和python多线程的话哪个效率更快呢
肯定是易语言,python是脚本语言,跟编译语言是没法比的,更何况易语言用的是C语言的编译器。
⑺ Python 多线程效率不高吗
在python的原始解释器CPython中存在着GIL(GlobalInterpreterLock,全局解释器锁),因此在解释执行python代码时,会产生互斥锁来限制线程对共享资源的访问,直到解释器遇到I/O操作或者操作次数达到一定数目时才会释放GIL。所以,虽然CPython的线程库直接封装了系统的原生线程,但CPython整体作为一个进程,同一时间只会有一个获得GIL的线程在跑,其他线程则处于等待状态。这就造成了即使在多核CPU中,多线程也只是做着分时切换而已。不过muiltprocessing的出现,已经可以让多进程的python代码编写简化到了类似多线程的程度了。
⑻ Python运行效率低的原因有哪些
Python的设计哲学是 第一能让人看懂,附带能在机器上运行,
c语言的设计哲学是 第一能让机器快速运行 附带能让人看懂
⑼ Python 多线程效率不高吗
python因为有GIL全局解释器锁,所以python的多线程不能利用多核,但是如果是io密集型的项目,多线程效率也很好,我就是用多线程来做爬虫的。