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方法等待时间达到。
屏幕快照 2022-01-27 上午12.00.06.png

然后进入第二阶段,在主裁判线程调用了notify_all方法之后,运动员开始跑起来。

屏幕快照 2022-01-26 下午11.59.56.png

扫描二维码关注公众号,回复: 14929588 查看本文章

运动员一个一个跑完,比赛结束了。

代码解析

这个代码跟前篇区别除了一些打印(print)输出,重点的改变就是wait函数传入时间。

通过这样设计,我们不需要第三个线程去通知主裁判继续喊。

这跟现实场景一样:赛场上,主裁判,观察完全部运动员准备好,然后就鸣枪(类似的3/2/1)。

总结

不知道有没有在看的读者朋友想到了这个实现?

面对田径运动场的场景,还有很多工具可以实现同等的场景,本篇旨在展示一个案例,各位可以通过学习这个代码,了解Condition类的使用。

喜欢Python的朋友,请关注学委的 Python基础专栏 or Python入门到精通大专栏

持续学习持续开发,我是雷学委!
编程很有趣,关键是把技术搞透彻讲明白。
欢迎关注微信,点赞支持收藏!

猜你喜欢

转载自blog.csdn.net/geeklevin/article/details/123157128