python怎么出123行

同时开启三个线程,分别只能输出1,2,3,并让三个线程按顺序输出打印123123123…这道问题简单来说就是一种红绿灯,我们先让红灯亮,过一段时间后黄灯亮,再过一段时间后绿灯量,以此类推。一般对于多线程而言,可以很容易的实现这三种颜色的切换,但是再不对其进行控制的话,他的执行顺序将会是乱的...
python怎么出123行
同时开启三个线程,分别只能输出1,2,3,并让三个线程按顺序输出打印123123123…

这道问题简单来说就是一种红绿灯,我们先让红灯亮,过一段时间后黄灯亮,再过一段时间后绿灯量,以此类推。一般对于多线程而言,可以很容易的实现这三种颜色的切换,但是再不对其进行控制的话,他的执行顺序将会是乱的,其可能在红灯之后还是红灯,绿灯之后还是绿灯(这要是在现实中将会引发巨大的灾难),因此要实现多线程之间的顺序执行,我们就需要使用到锁的概念,也就是Python中的GIL、同步锁(互斥锁)、递归锁(用来解决死锁,当有多个互斥锁存在的时候,可能会导致死锁),对于Python中锁的概念不进行阐述,我们在这里直接使用Threading.Lock来解决上述问题。

实现多线程的顺序执行,关键在于如何控制上锁lock.acquire()与锁的释放lock.release()。在这里我们可以将红绿灯的各种颜色的切换看作是上锁与释放锁。一开始是红灯亮,因此,在初始时刻对于红黄绿的三种锁中,只有红灯的锁是释放的,而黄灯和绿灯的锁是被锁着的,这样一来只有红灯的线程可以进入得到资源,从而显示为红灯,这里需要注意的是红灯的线程进入后,应将其锁给锁住,而不让其他线程进入(红灯亮着的时候,三个锁都是锁住的);当红灯显示时间结束后,下一个为黄灯,因此需要将黄灯的锁给释放掉,从而让黄灯的线程进入,进入后再将锁锁住;当黄灯显示完毕后,将绿灯的锁给打开,从而让绿灯显示,以此类推。

完整代码如下:

import threading
import time

red_lock = threading.Lock() # 红灯锁
yellow_lock = threading.Lock() # 黄灯锁
green_lock = threading.Lock() # 绿灯锁

count = 18 # 为避免一直循环,我们在这里假设每个数字输出6次,3×6=18

def red():
"""红灯显示函数"""
global count
while count >= 0:
red_lock.acquire() # 将红灯的锁给锁住
print(1, end = '-') # 将红灯表示为1
# print('id:', threading.get_ident()) # 查看线程id
yellow_lock.release() # 下一个为黄灯亮,将黄灯的锁给释放
count -= 1

def yellow():
"""黄灯显示函数"""
global count
while count >= 0:
yellow_lock.acquire() # 将黄灯的锁给锁住
print(2, end = '-') # 将黄灯表示为2
# print('id:', threading.get_ident())
green_lock.release() # 下一个为绿灯亮,将绿灯的锁给释放
count -= 1

def green():
"""绿灯显示函数"""
global count
while count >= 0:
green_lock.acquire() # 将绿灯的锁给锁住
print(3, end = '-') # 将绿灯表示为2
# print('id:', threading.get_ident())
red_lock.release() # 下一个为红灯亮,将红灯的锁给释放
count -= 1

if __name__ == '__main__':
thread_list = []

func_list = [red, yellow, green]
for func in func_list: # 创建三个线程
th = threading.Thread(target = func)
thread_list.append(th)

# 红灯先亮,因此将黄灯和绿灯的锁给锁住,以阻塞线程2和3的执行
yellow_lock.acquire() # 2上锁
green_lock.acquire() # 3上锁

for th in thread_list:
# print(time.time()) # 用于判断启动时间
th.start()

for th in thread_list:
th.join()
登录后复制

执行结果为:

1-2-3-1-2-3-1-2-3-1-2-3-1-2-3-1-2-3-1-2-3-
登录后复制
上面的判断启动时间的是用来看是否是同时启动的,由于for循环是有顺序的,因此三个线程的启动并不是同时的,虽然有些时候输出的时间会相同,但其实是不同的。2022-12-03
这道问题简单来说就是一种红绿灯,我们先让红灯亮,过一段时间后黄灯亮,再过一段时间后绿灯量,以此类推。一般对于多线程而言,可以很容易的实现这三种颜色的切换,但是再不对其进行控制的话,他的执行顺序将会是乱的,其可能在红灯之后还是红灯,绿灯之后还是绿灯(这要是在现实中将会引发巨大的灾难),因此要实现多线程之间的顺序执行,我们就需要使用到锁的概念,也就是Python中的GIL、同步锁(互斥锁)、递归锁(用来解决死锁,当有多个互斥锁存在的时候,可能会导致死锁),对于Python中锁的概念不进行阐述,我们在这里直接使用Threading.Lock来解决上述问题。

实现多线程的顺序执行,关键在于如何控制上锁lock.acquire()与锁的释放lock.release()。在这里我们可以将红绿灯的各种颜色的切换看作是上锁与释放锁。一开始是红灯亮,因此,在初始时刻对于红黄绿的三种锁中,只有红灯的锁是释放的,而黄灯和绿灯的锁是被锁着的,这样一来只有红灯的线程可以进入得到资源,从而显示为红灯,这里需要注意的是红灯的线程进入后,应将其锁给锁住,而不让其他线程进入(红灯亮着的时候,三个锁都是锁住的);当红灯显示时间结束后,下一个为黄灯,因此需要将黄灯的锁给释放掉,从而让黄灯的线程进入,进入后再将锁锁住;当黄灯显示完毕后,将绿灯的锁给打开,从而让绿灯显示,以此类推。2022-12-03
mengvlog 阅读 97 次 更新于 2025-09-11 12:15:54 我来答关注问题0
  • 同时开启三个线程,分别只能输出1,2,3,并让三个线程按顺序输出打印123123123…这道问题简单来说就是一种红绿灯,我们先让红灯亮,过一段时间后黄灯亮,再过一段时间后绿灯量,以此类推。一般对于多线程而言,可以很容易的实现这三种颜色的切换,但是再不对其进行控制的话,他的执行顺序将会是乱的...

  •  百度网友d33ef5f python怎么出123行

    1、首先打开python。2、其次点击打开空白文档。3、最后输入出123行即可。

  • 输入用空格分隔的两个正整数n和m,表示后面要接收m个人的n门课的成绩的输入。随后的m行,每行输入用空格分隔的n个成绩。题目保证m和n都在(0-100]之间。请分行输出每门课的平均成绩。输入 第一行输入用空格分隔的两个正整数n和m。随后的m行,每行输入用空格分隔的n个成绩。输出 分行输出每门课...

  •  猪八戒网 python最多能输出多少行记录(2023年最新分享)

    用Python输出9行内容,第一行输出1,第二行输出12,第三行输出123,以此类推,第九行输出123456789, ?s?=?'' ?for?i?in?range(1,?10): ???s?+=?str(i) ???print(s) ??? 1 12 123 1234 12345 123456 1234567 12345678 123456789 是这样吗 powerbipython最多多少行 本次统计中纯Python代码量最大的...

  • 在Windows系统中,打开命令行窗口是运行Python程序的第一步。通过命令行窗口,你可以直接执行Python脚本。例如,输入python 123.py命令,可以运行名为123.py的Python脚本。为了使这个命令能够正常工作,必须确保Python的环境变量已经正确设置。设置Python环境变量的具体步骤如下:1. 打开“控制面板”,选择“...

檬味博客在线解答立即免费咨询

Python相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部