python进程与线程,python如何获取进程和线程状态

1,python如何获取进程和线程状态threading.active_count()Return the number of Thread objects currently alive. The returned count is equal to the length of the list returned by enumerate().active_count可以返回当前活动的线程枚举我一般是这么用的def getHeatsParallel(self):threads = []for i in range(0, self.threadCount):t = threading.Thread(target=self.SomeFunction, name=str(i))threads.append(t)t.start()for t in threads:t.join()【python进程与线程,python如何获取进程和线程状态】
2,简述python进程线程和协程的区别及应用场景协程多与线程进行比较1) 一个线程可以多个协程,一个进程也可以单独拥有多个协程,这样python中则能使用多核CPU 。2) 线程进程都是同步机制,而协程则是异步3) 协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态1.线程和进程: 线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除 。线程可与属于同一进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈) 。2.线程、进程与协程:线程和进程的操作是由程序触发系统接口,最后的执行者是系统;协程的操作则是程序员协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保持状态,下次继续) 。协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序 。协程的适用场景: 当程序中存在大量不需要CPU的操作时(IO),适用于协程;
3,Python中进程和线程的区别详解什么是进程(Process):普通的解释就是,进程是程序的一次执行,而什么是线程(Thread),线程可以理解为进程中的执行的一段程序片段 。在一个多任务环境中下面的概念可以帮助我们理解两者间的差别:进程间是独立的,这表现在内存空间,上下文环境;线程运行在进程空间内 。一般来讲(不使用特殊技术)进程是无法突破进程边界存取其他进程内的存储空间;而线程由于处于进程空间内 , 所以同一进程所产生的线程共享同一内存空间 。同一进程中的两段代码不能够同时执行,除非引入线程 。线程是属于进程的 , 当进程退出时该进程所产生的线程都会被强制退出并清除 。线程占用的资源要少于进程所占用的资源 。进程和线程都可以有优先级 。在线程系统中进程也是一个线程 。可以将进程理解为一个程序的第一个线程 。线程是指进程内的一个执行单元,也是进程内的可调度实体.与进程的区别:(1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;(2)进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源(3)线程是处理器调度的基本单位,但进程不是.(4)二者均可并发执行.
4,为什么在Python里推荐使用多进程而不是多线程监控一个信号就起一个线程与进程处理 。这样的逻辑是不太合适的 。所有的资源都是有限的,如果这样浪费很快会资源管理失控 。常规的做法是起一个线程池,或者是进程池 。使用线程还是进程取决于你处理的信号的类型 。如果计算量大,则需要进程池,如果只是设备等待,比如网络数据收发 , 则线程也勉强够用 。信号过来后处理方法有两种,一种是实时处理,这个没有好办法,可以用“微线程”的办法做,尽量减少处理周期 。另外一种是允许少量的延迟 。那么通常的做法是用队列 。将信号放到线程或者是进程池的消息队列里 。然后再由后者分配 。还有一种高效的处理方法,根据信号的值做hash,然后自动分发到不同的cpu或者是服务器 。这个就算是大规模并发处理机制 。通常情况下,比如一个web服务器,它需要获取一个请求,然后处理响应,可以使用线程模型 , 或者是进程模型 。也是使用典型的池的方法 。一个pool的大于,取决于你的计算 机的计算 能力,内存大小 , 以及你的并发访问数量 。所要要启用多少个呢?假设你的一个信号的处理周期是1秒,你同时有100个信号进来,那么就需要100个线程或者是进程 。1、GIL是什么?GIL的全称是Global Interpreter Lock(全局解释器锁),来源是python设计之初的考虑,为了数据安全所做的决定 。2、每个CPU在同一时间只能执行一个线程(在单核CPU下的多线程其实都只是并发,不是并行,并发和并行从宏观上来讲都是同时处理多路请求的概念 。但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生 。)在Python多线程下,每个线程的执行方式:1、获取GIL2、执行代码直到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密集型代码比较友好 。因为python的底层实现GIL对于多线程的支持并不好 。还是只使用CPU的一个核,效率不高如果是多进程的话,可以充分利用CPU , 就是资源可能会用的多一点

    推荐阅读