前天才讲的知识点,不听讲的人今天就跑来问

简介: 前天才讲的知识点,不听讲的人今天就跑来问

今天在读者交流群里面,有同学提到这样一个问题:



1.png


2.png


这个同学想实现,在代码第35行,如果进入了 if 判断,那么就退出第40-43行对应的 ac 函数。


能问出这个问题,说明这个同学显然没有认真看我的微信公众号。就在几天前我才发了一篇文章:一日一技:Python多线程的事件监控。使用这篇文章里面讲到的方法,就可以轻易实现他的需求。


在那篇文章中,我们讲到了threading.Event,这个东西不仅可以在线程之间使用,也可以在主线程和子线程之间使用。


这个同学的代码不够清晰,我们稍稍修改一下:


import time
import threading
import datetime
class Monitor(threading.Thread):
    def __init__(self, endtime):
        super().__init__()
        print('ac 函数将会在:', endtime, '停止')
        self.endtime = endtime
    def run(self):
        while True:
            now = datetime.datetime.now()
            if now > self.endtime:
                print('结束主线程')
                # TODO: 这里需要做点什么事情
            time.sleep(1)
def ac():
    while True:
        print('主线程正在运行,现在时间', datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
        time.sleep(5)
if __name__ == '__main__':
    stop_time = datetime.datetime.now() + datetime.timedelta(seconds=60)
    monitor = Monitor(stop_time)
    monitor.start()
    ac()


如果你直接运行上面这段代码,你会发现程序每5秒钟会通过ac函数打印一条字符串,但永远不会停止。现在,我们在 需要在#TODO的位置怎么写代码,才能让程序停止呢?这个时候,我们把threading.Event引入进来。在外面生成并传给子线程:


import time
import threading
import datetime
class Monitor(threading.Thread):
    def __init__(self, endtime, event):
        super().__init__()
        self.endtime = endtime
        print('ac 函数将会在:', endtime, '停止')
        self.event = event
    def run(self):
        while True:
            now = datetime.datetime.now()
            if now > self.endtime:
                print('结束主线程')
                self.event.set()
                return
            time.sleep(1)
def ac(event):
    while not event.is_set():
        print('主线程正在运行,现在时间', datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
        time.sleep(5)
if __name__ == '__main__':
    event = threading.Event()
    stop_time = datetime.datetime.now() + datetime.timedelta(seconds=60)
    monitor = Monitor(stop_time, event)
    monitor.start()
    ac(event)


运行效果如下图所示:


3.png


当子线程检测到满足结束条件的时候,调用event.set()。主线程里面,ac函数使用一个循环不停检测event.is_set()。一开始event.is_set()始终返回 False,直到event.set()以后,就返回 True。这样一来,ac函数就像是收到了通知,于是可以结束函数的运行了。


请关注微信公众号【未闻Code】获取更多精彩文章。

目录
相关文章
|
7月前
|
监控 JavaScript 前端开发
ry-vue-flowable-xg:震撼来袭!这款基于 Vue 和 Flowable 的企业级工程项目管理项目,你绝不能错过
基于 Vue 和 Flowable 的企业级工程项目管理平台,免费开源且高度定制化。它覆盖投标管理、进度控制、财务核算等全流程需求,提供流程设计、部署、监控和任务管理等功能,适用于企业办公、生产制造、金融服务等多个场景,助力企业提升效率与竞争力。
436 12
|
6月前
|
域名解析 人工智能 API
使用阿里云服务器搭建自己的DeepSeek个人站点,3分钟尝鲜教程!
通过阿里云服务器,您可以0成本部署专属的DeepSeek网站。学生用户可领取300元代金券,实现免费部署;普通用户则可以选择99元/年的服务器方案。使用阿里云计算巢“DeepSeek个人站点-快速部署”服务,最快5分钟完成部署,无需编写代码。该服务集成了百炼API和Open WebUI,支持多种AI模型(如DeepSeek、Qwen-max、Llama等),并提供稳定、高性价比的个人专属AI网站体验。详情及教程请参考官方页面。
1213 1
|
11月前
|
SQL 存储 监控
串口调试助手连接SQL数据库的技巧与方法
串口调试助手是电子工程师和软件开发人员常用的工具,它能够帮助用户进行串口通信的调试和数据分析
|
缓存 前端开发 Java
在Java项目中实现跨域资源共享(CORS)
在Java项目中实现跨域资源共享(CORS)
|
C语言 Perl
西门子S7-1200编程实例,电动机起保停控制梯形图如何编写?
本篇我们通过一个电动机起保停控制的实例,介绍S7-1200的使用方法,按下瞬时启动按钮I0.6,电动机Q0.0启动,按下瞬时停止按钮I0.7,电动机Q0.0停止。
西门子S7-1200编程实例,电动机起保停控制梯形图如何编写?
|
存储 安全 数据管理
新一代数据库技术:融合区块链的分布式存储系统
传统数据库技术在面对日益增长的数据量和复杂的数据管理需求时显现出局限性。本文介绍了一种新一代数据库技术:融合区块链的分布式存储系统。通过将区块链技术与传统数据库相结合,实现了数据的分布式存储、安全性和透明度,以及去中心化的特性。这一技术的应用将极大地推动数据库系统的发展,为数据管理带来全新的解决方案。
|
存储 Kubernetes 调度
关于Pod的基础知识概览
【6月更文挑战第19天】Pod是Kubernetes的基本执行单元,是最小部署和管理的粒度,包含一个或多个共享网络和存储的容器,常比喻为豆荚中的豆子。Pod中的容器共享IP和端口,便于协作,支持Docker等容器运行时。
|
存储 编译器 C语言
【C/C++ POD 类型】深度解析C++中的POD类型:从理论基础到项目实践
【C/C++ POD 类型】深度解析C++中的POD类型:从理论基础到项目实践
1146 0
|
存储 数据库 时序数据库
InfluxDB是一个开源的时间序列数据库
InfluxDB是一个开源的时间序列数据库
299 2
|
消息中间件 监控 搜索推荐
基层卫生健康云综合管理平台源码(云HIS)
基层医疗云HIS作为基于云计算的B/S构架的HIS系统,为基层医疗机构提供了标准化的、信息化的、可共享的医疗信息管理系统,可有效进行医疗数据共享与交换,解决数据重复采集及信息孤岛等问题,实现对基层医疗数据的分析和挖掘,为基层卫生机构提供科学合理的业务管理服务。 可实现“云部署”,即可实现在云计算下的多种部署模式。系统采用SaaS服务模式的新驱动,功能设计充分合理,界面布局合理美观,每个用户可具有个性化工作台。
636 1