今天和大家聊聊有关Python线程的相关知识,大家都知道线程是有生命周期的,因为当线程被创建运行之后,它并不是一直处于执行状态的,每个线程都会有一个由出生到死亡的过程,而对于Python而言,它的生命周期共有5个状态,这五个状态分别是新建、就绪、运行、阻塞和死亡。
今天咱们就聊聊Python的这五个生命周期状态吧!
首先,咱们来看一下Python线程生命周期中的新建状态和就绪状态
在Python中如何创建线程咱们上次已经详细聊过了,大家都知道当创建了一个Thread对象或Thread子类的对象后,这个线程就处于新建状态,此时处于新建状态的线程并不会直接被执行,而是需要调用start()函数才能运行,当调用start()函数运行后,此时,该线程就会处于生命周期的第二个状态也就是就绪状态,此时Python解释器就会为其创建方法调用栈和程序计数器,大家要知道,其实处于继续状态的线程并没有开始运行,而只是表示这个线程可以运行了,是处于准备运行状态,只有当Python解释器真正对其进行调度会才会正式运行。
还有一点大家要注意,对于线程的启动在Python中调用的是start()方法,并不是run()方法,因此在让线程处于就绪状态时不要调用run()方法,实际上,调用start()方法启动线程,此时系统也就是Python解释器会把run()方法当作线程执行体进行处理。
然后,咱们再来看一下Python线程生命周期中的运行状态和阻塞状态
上面咱们已经说到了线程的第二个状态:就绪状态,此时如果处于就绪状态的线程如果获得了CPU,就是执行咱们上面所说的run()方法的线程执行体,此时这个线程就会处于运行状态。
当然,对于一个线程运行后,这个线程不会永远都处于运行状态,因为如果有优先级更高的线程就会将这个线程进行中断,从而去执行更高优先级的线程,线程调度的细节其实是取决于底层平台所采用的策略的。
当处于运行状态的线程被中断后,这个线程就会进入阻塞状态,那么发生什么条件才会进入阻塞状态呢?比如线程调用sleep()方法时该线程就会处于休眠状态从而就会放弃所占用的资源,还有如果线程调用了一个阻塞式IO方法,此时在该方法返回之前,这个线程也会被阻塞;还有一个线程如果获得一个锁对象时,那么这个锁对象如果正在被其他线程持有时,此时这个线程也会处于阻塞状态;还有如果线程在等待某个通知时也会进入阻塞状态。
最后,咱们再来看一下Python线程生命周期中的最后一个线程死亡状态
线程何时才会进入死亡状态呢?注意有两种情况出现时就会进行死亡状态,第一种情况是当run()方法或代表线程执行体的target函数执行完成,线程正常结束;第二种情况是线程抛出一个未捕获的Exception或Error时,线程也会进入死亡状态。
当然,为了测试某个线程是否已经死亡,也可以调用线程对象的is_alive()方法,当线程处于就绪、运行和阻塞三种状态时,该方法将会返回True,当然,当线程处于新建、死亡两种状态时,is_alive()方法将返回False。
好啦,上面就是有关Python线程生命周期的所有内容,可能会有些晦涩,但大家细细品味一下,就会对于Python线程生命周期中的五个状态就会深入了解了!