同时开启三个线程,分别只能输出1,2,3,并让三个线程按顺序输出打印123123123…

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

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

完整代码如下:

import threading
import timered_lock = threading.Lock()      # 红灯锁
yellow_lock = threading.Lock()   # 黄灯锁
green_lock = threading.Lock()    # 绿灯锁count = 18   # 为避免一直循环,我们在这里假设每个数字输出6次,3×6=18def red():"""红灯显示函数"""global countwhile count >= 0:red_lock.acquire()      # 将红灯的锁给锁住print(1, end = '-')     # 将红灯表示为1# print('id:', threading.get_ident())  # 查看线程idyellow_lock.release()   # 下一个为黄灯亮,将黄灯的锁给释放count -= 1def yellow():"""黄灯显示函数"""global countwhile count >= 0:yellow_lock.acquire()   # 将黄灯的锁给锁住print(2, end = '-')     # 将黄灯表示为2# print('id:', threading.get_ident())green_lock.release()    # 下一个为绿灯亮,将绿灯的锁给释放count -= 1def green():"""绿灯显示函数"""global countwhile count >= 0:green_lock.acquire()    # 将绿灯的锁给锁住print(3, end = '-')     # 将绿灯表示为2# print('id:', threading.get_ident())red_lock.release()      # 下一个为红灯亮,将红灯的锁给释放count -= 1if __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循环是有顺序的,因此三个线程的启动并不是同时的,虽然有些时候输出的时间会相同,但其实是不同的。

好好学习,天天向上。

python实现多线程输出123123相关推荐

  1. python多线程输出_Python多线程

    多线程基础概念 并行与并发 并行:同时处理多个任务,必须在多核环境下 一段时间内同时处理多个任务,单核也可以并发 并发手段 线程:内核空间的调度 进程:内核空间的调度 协程:用户空间的调度 线程可以允 ...

  2. 【记录】python多线程的使用 线程同步(LOCK和RLOCK) python与mysql数据库交互实现增加和查找 python的格式化输出

    文章目录 多线程: _thread模块 threading模块: 线程同步(LOCK和RLOCK) 和mysql交互: 附:python的格式化输出 附录 多线程: _thread模块 例一 impo ...

  3. python爬取百度贴吧中的所有邮箱_使用 Python 编写多线程爬虫抓取百度贴吧邮箱与手机号...

    原标题:使用 Python 编写多线程爬虫抓取百度贴吧邮箱与手机号 不知道大家过年都是怎么过的,反正栏主是在家睡了一天,醒来的时候登QQ发现有人找我要一份贴吧爬虫的源代码,想起之前练手的时候写过一个抓 ...

  4. 【script】python实现多线程将doc、docx转pdf,doc转docx

    摘要 本文讲述通过python实现多线程将当前目录下的 .doc文档转.pdf..docx文档转.pdf,以及.doc文档转.docx(在python中,如需对word文档进行读写,只能读写docx格 ...

  5. python房地产爬虫_房产中介网站爬虫实战(Python BS4+多线程)(一)

    本系列文章介绍了爬取链家和搜房网(房天下)数据的方法. 房产中介网站爬虫实战(Python BS4+多线程)(一) 房产中介网站爬虫实战(Python BS4+多线程)(二) 房地产市场向来是大数据分 ...

  6. python多核多线程编程实例_Python多线程

    多线程基础概念 并行与并发并行:同时处理多个任务,必须在多核环境下 一段时间内同时处理多个任务,单核也可以并发 并发手段线程:内核空间的调度 进程:内核空间的调度 协程:用户空间的调度 线程可以允许程 ...

  7. 进程、线程及python的多线程编程

    目录 一.进程.线程和并行执行 1.什么是进程.线程 注意 2.什么是并行执行 二.python的多线程编程 threading模块 语法 多线程编程的传参 演示 三.总结 一.进程.线程和并行执行 ...

  8. python异步多线程

    Python异步多线程 首先,我们需要先明白同步和异步的区别: 同步:同步是指一个进程在执行某个请求的时候,如果该请求需要一段时间才能返回信息,那么这个进程会一直等待下去,直到收到返回信息才继续执行下 ...

  9. python的多线程和多进程网络编程

    二十八.python的多线程和多进程网络编程 线程和进程关系: 进程是具有独立功能的程序,进程是系统进行资源分配和调度的一个独立单位 线程是进程的一个实体,是cpu调度的基本单位,它是比进程更小的能独 ...

  10. python学习——多线程

    python学习--多线程 概念 python中线程的开发 线程的启动 线程的退出和传参 threading的属性和方法 threading实例的属性和方法 多线程 daemon线程和non-demo ...

最新文章

  1. 程序猿必备的硬核知识,你知道哪些?
  2. Eclipse转Intellij IDEA
  3. java学习笔记(七)数据库链接字符
  4. NET问答: 为什么 null + true = string 呢?
  5. Fedora12上编译安装gdb-7.2
  6. linux uwsgi 非root,nginx – 只能用root运行uwsgi
  7. PhpStorm下Laravel代码智能提示
  8. html中加入数据库,HTML中如何连接数据库?
  9. 关于caffe-ssd训练时smooth_L1到底参与运算与否的问题
  10. svm分类代码_数据挖掘入门系列教程(九)之基于sklearn的SVM使用
  11. 【Ubuntu和本地电脑互传文件】
  12. 老农的计算机学习笔记(二)硬件篇
  13. 定义一个描述学生通讯录的类AddressBook并输出
  14. C语言可变参数va_list
  15. dither(抖动)
  16. 如何在IGV上使用BLAT搜索非模式物种
  17. 关于数据可视化图表的制作,你需要关注的30个小技巧
  18. WordPress给博客文章页添加个性名片
  19. 自制PMW3901光流模块
  20. 【专知荟萃18】目标跟踪Object Tracking知识资料全集(入门/进阶/论文/综述/视频/专家,附查看)

热门文章

  1. 兄弟9020cdn提示更换粉盒_兄弟打印机提示更换墨粉盒怎么办
  2. 获取Android手机短信中心号码
  3. 数字逻辑实验五 七人表决器
  4. HiveSQL正则表达式的应用
  5. 计算KL散度与JS散度的MATLAB程序
  6. npm安装github包
  7. 华为路由器OSPF基础配置命令
  8. HaaS EDU场景式应用学习 - 光照信息屏
  9. 基于C++和AStar算法求解八数码问题的方案
  10. TEM014 - 新版阿里云网站界面高保真原型模板-AxureUX