python实现多线程输出123123
同时开启三个线程,分别只能输出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相关推荐
- python多线程输出_Python多线程
多线程基础概念 并行与并发 并行:同时处理多个任务,必须在多核环境下 一段时间内同时处理多个任务,单核也可以并发 并发手段 线程:内核空间的调度 进程:内核空间的调度 协程:用户空间的调度 线程可以允 ...
- 【记录】python多线程的使用 线程同步(LOCK和RLOCK) python与mysql数据库交互实现增加和查找 python的格式化输出
文章目录 多线程: _thread模块 threading模块: 线程同步(LOCK和RLOCK) 和mysql交互: 附:python的格式化输出 附录 多线程: _thread模块 例一 impo ...
- python爬取百度贴吧中的所有邮箱_使用 Python 编写多线程爬虫抓取百度贴吧邮箱与手机号...
原标题:使用 Python 编写多线程爬虫抓取百度贴吧邮箱与手机号 不知道大家过年都是怎么过的,反正栏主是在家睡了一天,醒来的时候登QQ发现有人找我要一份贴吧爬虫的源代码,想起之前练手的时候写过一个抓 ...
- 【script】python实现多线程将doc、docx转pdf,doc转docx
摘要 本文讲述通过python实现多线程将当前目录下的 .doc文档转.pdf..docx文档转.pdf,以及.doc文档转.docx(在python中,如需对word文档进行读写,只能读写docx格 ...
- python房地产爬虫_房产中介网站爬虫实战(Python BS4+多线程)(一)
本系列文章介绍了爬取链家和搜房网(房天下)数据的方法. 房产中介网站爬虫实战(Python BS4+多线程)(一) 房产中介网站爬虫实战(Python BS4+多线程)(二) 房地产市场向来是大数据分 ...
- python多核多线程编程实例_Python多线程
多线程基础概念 并行与并发并行:同时处理多个任务,必须在多核环境下 一段时间内同时处理多个任务,单核也可以并发 并发手段线程:内核空间的调度 进程:内核空间的调度 协程:用户空间的调度 线程可以允许程 ...
- 进程、线程及python的多线程编程
目录 一.进程.线程和并行执行 1.什么是进程.线程 注意 2.什么是并行执行 二.python的多线程编程 threading模块 语法 多线程编程的传参 演示 三.总结 一.进程.线程和并行执行 ...
- python异步多线程
Python异步多线程 首先,我们需要先明白同步和异步的区别: 同步:同步是指一个进程在执行某个请求的时候,如果该请求需要一段时间才能返回信息,那么这个进程会一直等待下去,直到收到返回信息才继续执行下 ...
- python的多线程和多进程网络编程
二十八.python的多线程和多进程网络编程 线程和进程关系: 进程是具有独立功能的程序,进程是系统进行资源分配和调度的一个独立单位 线程是进程的一个实体,是cpu调度的基本单位,它是比进程更小的能独 ...
- python学习——多线程
python学习--多线程 概念 python中线程的开发 线程的启动 线程的退出和传参 threading的属性和方法 threading实例的属性和方法 多线程 daemon线程和non-demo ...
最新文章
- 程序猿必备的硬核知识,你知道哪些?
- Eclipse转Intellij IDEA
- java学习笔记(七)数据库链接字符
- NET问答: 为什么 null + true = string 呢?
- Fedora12上编译安装gdb-7.2
- linux uwsgi 非root,nginx – 只能用root运行uwsgi
- PhpStorm下Laravel代码智能提示
- html中加入数据库,HTML中如何连接数据库?
- 关于caffe-ssd训练时smooth_L1到底参与运算与否的问题
- svm分类代码_数据挖掘入门系列教程(九)之基于sklearn的SVM使用
- 【Ubuntu和本地电脑互传文件】
- 老农的计算机学习笔记(二)硬件篇
- 定义一个描述学生通讯录的类AddressBook并输出
- C语言可变参数va_list
- dither(抖动)
- 如何在IGV上使用BLAT搜索非模式物种
- 关于数据可视化图表的制作,你需要关注的30个小技巧
- WordPress给博客文章页添加个性名片
- 自制PMW3901光流模块
- 【专知荟萃18】目标跟踪Object Tracking知识资料全集(入门/进阶/论文/综述/视频/专家,附查看)