🔫python实现多线程顺序打印
2022-6-13
| 2023-4-5
0  |  阅读时长 0 分钟
type
status
password
date
slug
summary
category
URL
tags
icon

红绿灯问题

同时开启三个线程,分别只能输出1,2,3,并让三个线程按顺序输出打印123123123…
这道问题简单来说就是一种红绿灯,我们先让红灯亮,过一段时间后黄灯亮,再过一段时间后绿灯量,以此类推。一般对于多线程而言,可以很容易的实现这三种颜色的切换,但是再不对其进行控制的话,他的执行顺序将会是乱的,其可能在红灯之后还是红灯,绿灯之后还是绿灯(这要是在现实中将会引发巨大的灾难),因此要实现多线程之间的顺序执行,我们就需要使用到锁的概念,也就是Python中的GIL、同步锁(互斥锁)、递归锁(用来解决死锁,当有多个互斥锁存在的时候,可能会导致死锁),对于Python中锁的概念不进行阐述,我们在这里直接使用Threading.Lock来解决上述问题。
实现多线程的顺序执行,关键在于如何控制上锁lock.acquire()与锁的释放lock.release()。在这里我们可以将红绿灯的各种颜色的切换看作是上锁与释放锁。一开始是红灯亮,因此,在初始时刻对于红黄绿的三种锁中,只有红灯的锁是释放的,而黄灯和绿灯的锁是被锁着的,这样一来只有红灯的线程可以进入得到资源,从而显示为红灯,这里需要注意的是红灯的线程进入后,应将其锁给锁住,而不让其他线程进入(红灯亮着的时候,三个锁都是锁住的);当红灯显示时间结束后,下一个为黄灯,因此需要将黄灯的锁给释放掉,从而让黄灯的线程进入,进入后再将锁锁住;当黄灯显示完毕后,将绿灯的锁给打开,从而让绿灯显示,以此类推。
完整代码如下:
执行结果为:
上面的判断启动时间的是用来看是否是同时启动的,由于for循环是有顺序的,因此三个线程的启动并不是同时的,虽然有些时候输出的时间会相同,但其实是不同的。
 
海量数据处理数据目录概述
Loading...
目录