行业动态

python-多线程原理

  多线程的基本概念

  语言学习总是绕不过一些东西,例如多进程和多线程,最近越来越发现,上来看几个实例练习一下过几天就不知其所以然了。所以还是先看看原理吧!

  线程的概念

  概念:线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。其实平时我们启动程序,其实是启动的进程,但是在往下细分的话,其实是进程的一个或者多个线程完成的功能。

  好处 :(1)易于调度。

  (2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。

  (3)开销少。创建线程比创建进程要快,所需开销很少。

  (4)利于充分发挥多处理器的功能。通过创建多线程进程,每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。

  多线程vs多进程

  操作系统会为每个进程分配不同的内存块,而多个线程共享进程的内存块。这带来最直接的不同就是创建线程的开销远小于创建进程的开销。

  同时,由于内存块不同,所以进程之间的通信相对困难。而线程间的通信简单快速,就是共享进程内的全局变量。

  但是,进程的调度由操作系统负责,线程的调度需要我们自己来考虑,避免死锁,饥饿,活锁,资源枯竭等情况的发生,这会增加一定的复杂度,这会增加一定的复杂度。而且,由于线程之间共享内存,我们还需要考虑线程安全性的问题。

  线程安全

  以为线程间共享进程中的全局变量,所以当其他线程改变了共享的变量时,可能会对本线程产生影响。所谓线程安全的约束是指一个函数被多个并发线程反复调用时,要一直产生正确的结果。要保证线程安全,主要是通过加锁的方式保证共享变量的正确访问。

  比线程安全更严格的约束是‘可重入性’,即函数在一个线程内执行的工程中被暂停,接下来又在另一个线程内被调用,之后在返回原线程继续执行。在整个过程中都能保证正确执行。保证可重入性,通常通过制作全局变量的本地拷贝来实现。

  线程的生命周期

  线程的生命周期如下图所示

  

upfile1608194253977.png

  各个状态的说明如下:

  1.new新建。新创建的线程经过初始化后,进入Runnable状态。

  2.Runnable就绪。等待线程调度。调度后进入运行状态。

  3.Running运行。

  4.Blocked阻塞,暂停运行,解除阻塞后进入Runnable状态重新等待调度。

  5.Dead消亡。线程方法执行完毕返回或者异常终止。

  可能有3种情况从Running进入Blocked:

  同步:线程中获取同步锁,但是资源已经被其他线程锁定时,进入Locked状态,直到该资源可获取(获取的顺序由Lock队列控制)

  睡眠:线程运行sleep()或join()方法后,线程进入Sleeping状态。区别在于sleep等待固定的时间,而join是等待子线程执行完。当然join也可以指定一个“超时时间”。从语义上来说,如果两个线程a,b, 在a中调用b.join(),相当于合并(join)成一个线程。最常见的情况是在主线程中join所有的子线程。

  等待:线程中执行wait()方法后,线程进入Waiting状态,等待其他线程的通知(notify)。

  线程的类型

  主线程:当一个程序启动时,就有一个进程被操作系统(OS)创建,与此同时一个线程也立刻运行,该线程通常叫做程序的主线程(Main Thread)。每个进程至少都有一个主线程,主线程通常最后关闭。

  子线程:在程序中创建的其他线程,相对于主线程来说就是这个主线程的子线程。

  守护线程:daemon thread,对线程的一种标识。守护线程为其他线程提供服务,如JVM的垃圾回收线程。当剩下的全是守护线程时,进程退出。

  前台线程:相对于守护线程的其他线程称为前台线程。

        以上是关于python多线程原理的知识,由多测师亲自撰写,全网独家提供!  https://www.duoceshi.com/

新闻资讯

联系我们

联系人:王老师

手机:15873483787

电话:0755-21072941

邮箱:hr@duoceshi.com

地址: 广东省深圳市龙华区龙华街道龙园社区人民路宾馆花园18栋信盈广场A栋4层

用手机扫描二维码关闭
二维码