Python的线程18 Condition类实现田径运动场景
Posted 雷学委
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python的线程18 Condition类实现田径运动场景相关的知识,希望对你有一定的参考价值。
正式的Python专栏第55篇,同学站住,别错过这个从0开始的文章!
前篇学委简单介绍了Condition类。这个类有几个特别的函数。
当一个裁判员获取锁,然后执行notify_all函数后,其他运动员线程开始准备。
这个是前篇实现的内容。
可是裁判线程进入等待状态了,后续的3/2/1没有机会喊出来,其他运动员线程也只能一致等待。
限时等待 : wait(一个时长)
我们知道Condition对象调用wait之后,线程会进入等待。
当运动员和主裁判都在等待,场外也没有线程告诉主裁判可以开始喊
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2022/1/23 11:19 下午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷学委
# @XueWeiTag: CodingDemo
# @File : thread_condition.py
# @Project : hello
import threading
import time
condition = threading.Condition()
read_condition = threading.Condition()
counter = "value": 0
def wait_and_run():
condition.acquire()
print("%s wait for signal " % threading.current_thread().name)
counter['value'] += 1
condition.wait()
print("%s run" % threading.current_thread().name)
time.sleep(0.5)
print("%s completed" % threading.current_thread().name)
condition.release()
threads = []
for i in range(1, 11):
t = threading.Thread(name="运动员" + str(i), target=wait_and_run)
threads.append(t)
def fire():
condition.acquire()
print("预备")
condition.notify_all()
condition.wait(1)
print("3...")
condition.wait(1)
print("2...")
condition.wait(1)
print("1...")
print("fire")
condition.notify_all()
condition.wait(5)
threading.Thread(name="主裁判", target=fire).start()
print("看热闹")
for t in threads:
t.start()
for t in threads:
t.join()
print("比赛结束")
我们先看一下运行效果:
第一阶段,运动员等待(前篇做的)完之后裁判开始喊3/2/1。 因为wait方法等待时间达到。
然后进入第二阶段,在主裁判线程调用了notify_all方法之后,运动员开始跑起来。
运动员一个一个跑完,比赛结束了。
代码解析
这个代码跟前篇区别除了一些打印(print)输出,重点的改变就是wait函数传入时间。
通过这样设计,我们不需要第三个线程去通知主裁判继续喊。
这跟现实场景一样:赛场上,主裁判,观察完全部运动员准备好,然后就鸣枪(类似的3/2/1)。
总结
不知道有没有在看的读者朋友想到了这个实现?
面对田径运动场的场景,还有很多工具可以实现同等的场景,本篇旨在展示一个案例,各位可以通过学习这个代码,了解Condition类的使用。
喜欢Python的朋友,请关注学委的 Python基础专栏 or Python入门到精通大专栏
持续学习持续开发,我是雷学委!
编程很有趣,关键是把技术搞透彻讲明白。
欢迎关注微信,点赞支持收藏!
以上是关于Python的线程18 Condition类实现田径运动场景的主要内容,如果未能解决你的问题,请参考以下文章
Python的线程18 Condition类实现田径运动场景
基于condition 实现的线程安全的优先队列(python实现)
Java多线程:BlockingQueue实现原理(Condition原理)