Python多线程,多进程不能同时执行?

作者&投稿:濮临 (若有异议请与网页底部的电邮联系)
为什么在python里推荐使用多进程而不是多线程~

在Python多线程下,每个线程的执行方式:
1、获取GIL
2、执行代码直到sleep或者是python虚拟机将其挂起。
3、释放GIL

可见,某个线程想要执行,必须先拿到GIL,我们可以把GIL看作是“通行证”,并且在一个python进程中,GIL只有一个。拿不到通行证的线程,就不允许进入CPU执行。

在Python2.x里,GIL的释放逻辑是当前线程遇见IO操作或者ticks计数达到100(ticks可以看作是Python自身的一个计数器,专门做用于GIL,每次释放后归零,这个计数可以通过
sys.setcheckinterval 来调整),进行释放。

而每次释放GIL锁,线程进行锁竞争、切换线程,会消耗资源。并且由于GIL锁存在,python里一个进程永远只能同时执行一个线程(拿到GIL的线程才能执行),这就是为什么在多核CPU上,python的多线程效率并不高。

那么是不是python的多线程就完全没用了呢?
在这里我们进行分类讨论:
1、CPU密集型代码(各种循环处理、计数等等),在这种情况下,由于计算工作多,ticks计数很快就会达到阈值,然后触发GIL的释放与再竞争(多个线程来回切换当然是需要消耗资源的),所以python下的多线程对CPU密集型代码并不友好。

2、IO密集型代码(文件处理、网络爬虫等),多线程能够有效提升效率(单线程下有IO操作会进行IO等待,造成不必要的时间浪费,而开启多线程能在线程A等待时,自动切换到线程B,可以不浪费CPU的资源,从而能提升程序执行效率)。所以python的多线程对IO密集型代码比较友好。


而在python3.x中,GIL不使用ticks计数,改为使用计时器(执行时间达到阈值后,当前线程释放GIL),这样对CPU密集型程序更加友好,但依然没有解决GIL导致的同一时间只能执行一个线程的问题,所以效率依然不尽如人意。

请注意:多核多线程比单核多线程更差,原因是单核下多线程,每次释放GIL,唤醒的那个线程都能获取到GIL锁,所以能够无缝执行,但多核下,CPU0释放GIL后,其他CPU上的线程都会进行竞争,但GIL可能会马上又被CPU0拿到,导致其他几个CPU上被唤醒后的线程会醒着等待到切换时间后又进入待调度状态,这样会造成线程颠簸(thrashing),导致效率更低


回到最开始的问题:经常我们会听到老手说:“python下想要充分利用多核CPU,就用多进程”,原因是什么呢?

原因是:每个进程有各自独立的GIL,互不干扰,这样就可以真正意义上的并行执行,所以在python中,多进程的执行效率优于多线程(仅仅针对多核CPU而言)。

所以在这里说结论:多核下,想做并行提升效率,比较通用的方法是使用多进程,能够有效提高执行效率

thread是一个多线程模块
如果想实现多进程,可以同时创建多个脚本同时运行

进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”。 线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。

Process(target=serv.send_msg(), args=())
这是什么意思?target=serv.send_msg ?

打开任务管理器看看,是不是有两个python


python多线程的几种方法
Python多线程的几种方法:1. 使用`threading`模块:Python标准库中的`threading`模块提供了多线程支持。可以通过创建`Thread`对象来开启新的线程。这是实现多线程编程的基础方法。2. 使用`concurrent.futures`模块:Python的`concurrent.futures`模块提供了更高级的异步任务处理机制,包括线程池和进程池。它简...

python最多可以开多少线程(python怎么开启多线程)
第一个程序,使用循环来创建线程,但是这个程序中一共有51个线程,我们创建了50个线程,但是还有一个程序本身的线程,是主线程。这51个线程是并行的。注意:这个程序中是主线程启动了子线程。相比上个程序,这个程序多了一步计算时间,但是我们观察结果会发现,程序显示的执行时间只有0.007秒,这是因为...

python最多创建多少个线程(2023年最新整理)
ulimit-s返回线程栈大小,我的默认是8192,用内存大小除以它就得到理论上的线程数吧。 python创建多少个线程得到最优的执行效率? python因为有GIL全局解释器锁,所以python的多线程不能利用多核,但是如果是io密集型的项目,多线程效率也很好,我就是用多线程来做爬虫的。Python面试题,线程与进程的区别,Python中如何创建多...

python多少个线程合适
Python的多线程问题。。python的GIL规定每个时刻只能有一个线程访问python虚拟机,所以你要用python的多线程来做计算是很不合算的,但是对于IO密集型的应用,例如网络交互来说,python的多线程还是非常给力的。如果你是一个计算密集型的任务,非要用python来并行执行的话,有以下几个方法:1使用python的mult...

python线程多少个好(2023年最新整理)
python多线程python支持多线程效果还不错,很多方面都用到了python多线程的知识,我前段时间用python多线程写了个处理生产者和消费者的问题,把代码贴出来给你看下:encoding=utf-8 importthreading importrandom importtime fromQueueimportQueue classProducer(threading.Thread):def__init__(self,threadname...

python可以开多少个进程(python开多线程)
pythonprocess最多能多少个进程由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。Python提供了非常好用的多进程包multiprocessing,只需要定义一个函数,Python会完成其他所有事情。借助这个包,可以轻松完成从单进程到并发执行的...

python最多能起多少携程?
pythonmultiprocessing最大多少进程最大进程只受操作系统资源限制.不是进程越多越好,程序的速度就越快.一般有几个CPU核心,就开多少进程,或者核心数的N倍.python多线程作用总结起来,使用多线程编程具有如下几个优点:进程之间不能共享内存,但线程之间共享内存非常容易。操作系统在创建进程时,需要为该进程...

python多线程能提高效率吗
在某些情况下,Python多线程可以提高程序的执行效率。多线程是指在一个程序中同时运行多个线程,每个线程可以执行不同的任务,从而实现并发执行。多线程可以提高效率的情况包括:1、并行任务:如果程序中有多个任务可以并行执行,即它们不会相互阻塞或依赖彼此的结果,那么使用多线程可以同时执行这些任务,从而...

python的多线程无法并行
在Python中使用多线程时,由于Python的全局解释器锁(GlobalInterpreterLock,简称GIL)的存在,多个线程无法真正并行执行。GIL是Python解释器中的一个机制,它保证同一时刻只有一个线程可以执行Python字节码,即同一时刻只有一个线程可以占用CPU。这意味着,即使我们使用多线程创建了多个线程,这些线程也只能在同一...

python查看当前有多少线程(2023年最新解答)
python多线程状态一般在子线程\/进程里打印信息,来判断不同线程\/进程运行到了指定位置。类的方式实例化后,可以调用is_alive()方法判断是否在运行。下面这里有个例子可以试试,有注释,会python的话应该直接就能看懂。Python多线程总结在实际处理数据时,因系统内存有限,我们不可能一次把所有数据都导出进行...

龙港区15532463263: Python多线程,多进程不能同时执行? -
钭行潘舒: 进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握.关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”. 线程是程序中一个单一的顺序控制流程.进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位.在单个程序中同时运行多个线程完成不同的工作,称为多线程.

龙港区15532463263: python 多进程没有并发执行是怎么回事? -
钭行潘舒: 不会,python目前不适应运行在多核上的多线程.仅能使用单核,如果需要多核你可以考虑多进程方式.

龙港区15532463263: python多进程,不能在同一窗口吗 -
钭行潘舒: 不能. 题主的意思应该是使用多线程获取网页信息,然而一个html文档必须占用一个窗口,现代浏览器使用标签页解决这个问题,那么题主可以在firefox中设置默认使用标签页打开窗口. 另外,应该在主线程中打开全部窗口,然后将窗口对象传递至子进程.否则,firefox会认为自己被多个进程调用.

龙港区15532463263: python多进程中同一时间到底有几个线程在运行 -
钭行潘舒: 由于GIL锁的原因,python的多线程在同一时间同一个进程中,只有一个线程在运行.

龙港区15532463263: python 多线程怎么同时一直运行 -
钭行潘舒: 科技在发展,时代在进步,我们的CPU也越来越快,CPU抱怨,P大点事儿占了我一定的时间,其实我同时干多个活都没问题的;于是,操作系 统就进入了多任务时代.我们听着音乐吃着火锅的不在是梦想.python提供了两个模块来实现多线程thread 和threading ,thread 有一些缺点,在threading 得到了弥补,为了不浪费你和时间,所以我们直 接学习threading 就可以了.

龙港区15532463263: python3 创建线程时不用args传参,执行线程时为什么不是同时执行? -
钭行潘舒: 在Python多线程下,每个线程的执行方式:1、获取GIL2、执行代码直到sleep或者是python虚拟机将其挂起.3、释放GIL 可见,某个线程想要执行,必须先拿到GIL,我们可以把GIL看作是“通行证”,并且在一个python进程中,GIL只有一个....

龙港区15532463263: python 多线程与多进程问题? -
钭行潘舒: 监控一个信号就起一个线程与进程处理.这样的逻辑是不太合适的.所有的资源都是有限的,如果这样浪费很快会资源管理失控.常规的做法是起一个线程池,或者是进程池. 使用线程还是进程取决于你处理的信号的类型.如果计算量大,则...

龙港区15532463263: python 多线程为什么没有并行 -
钭行潘舒: 1. GIL是什么?  GIL的全称是Global Interpreter Lock(全局解释器锁),来源是python设计之初的考虑,为了数据安全所做的决定.2. 每个CPU在同一时间只能执行一个线程   在单核CPU下的多线程其实都只是并发,不是并行,并发和并行从宏观上来讲都是同时处理多路请求的概念.但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生.

龙港区15532463263: python py文件同时开两个线程可以吗 -
钭行潘舒: 可以的.Python 多线程 多线程类似于同时执行多个不同程序,多线程运行有如下优点:使用线程可以把占据长时间的程序中的任务放到后台去处理.用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一...

龙港区15532463263: 如何使用Python实现并发编程 -
钭行潘舒: 多线程几乎是每一个程序猿在使用每一种语言时都会首先想到用于解决并发的工具(JS程序员请回避),使用多线程可以有效的利用CPU资源(Python例外).然而多线程所带来的程序的复杂度也不可避免,尤其是对竞争资源的同步问题.然...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网