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

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

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



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】获取更多精彩文章。

目录
相关文章
|
8月前
|
数据采集 算法 Java
业余爱好者想入门编程,一定远离那些只会说No的家伙,尤其程序员
业余爱好者想入门编程,一定远离那些只会说No的家伙,尤其程序员
74 2
|
8月前
|
人工智能 Java 关系型数据库
985毕业,我依然过不好这一生?(大厂java开发2年被裁)
看到标题,可能很多读者朋友恐怕又要骂我了,985这个特殊的字眼也确实异常晃眼,实际上现在985,211也越来越多,它能代表你能够进入到更高的平台,拿到“高级工厂”的入场券,但并不意味着你会成为赢家,或者说也不代表着你会站在金字塔的顶端,因为顶端往往是少数人,位置有限,太挤了总会掉下来,而我就是被挤下来的那一拨人中的一个。
|
监控 Python
前天才讲的知识点,不听讲的人今天就跑来问
前天才讲的知识点,不听讲的人今天就跑来问
104 0
|
缓存 监控 程序员
程序员的自我修养--读书笔记 (跑路人笔记)
程序员的自我修养--读书笔记 (跑路人笔记)
程序员的自我修养--读书笔记 (跑路人笔记)
|
监控 算法 Java
花了好几个晚上整理的JVM知识点,吐血献出(一)(下)
花了好几个晚上整理的JVM知识点,吐血献出(一)(下)
161 0
花了好几个晚上整理的JVM知识点,吐血献出(一)(下)
|
存储 缓存 安全
花了好几个晚上整理的JVM知识点,吐血献出(一)(上)
花了好几个晚上整理的JVM知识点,吐血献出(一)
128 0
花了好几个晚上整理的JVM知识点,吐血献出(一)(上)
|
存储 人工智能 算法
练了那么多,为啥还不会编程
Python 技术已经一岁多了,持续不断地推出新知识、新技术、新技巧,不过很多童鞋存在一个疑问:学这么多编程知识、技术、技巧到底有什么用?对呀,技术日新月异,层出不穷,解决方案如雨后春笋,对于我们普通人来说,编程到底有什么用,今天我来谈谈这个问题,期望对你有所启发。
178 0
练了那么多,为啥还不会编程
|
关系型数据库 MySQL 测试技术
干了3年程序员,熬夜一周整理的高性能MySQL笔记,小白也能看懂!
MySQL高性能第三版更新了大量的内容,不但涵盖了最新版MySQL的新特性以外,还讲述了关于固态盘、高可拓展性设计和云计算环境下的数据库相关的新内容,原有的基准测试和性能优化部分也做了大量的扩展和补充,全书分为16个知识点点
136 0
|
设计模式 算法 网络协议
凌晨起来肝的一篇 Java 学习路线,保证学弟学妹们大三大四的时候顺利找到实习 Offer(1)
凌晨起来肝的一篇 Java 学习路线,保证学弟学妹们大三大四的时候顺利找到实习 Offer
182 0
凌晨起来肝的一篇 Java 学习路线,保证学弟学妹们大三大四的时候顺利找到实习 Offer(1)
|
SQL 前端开发 JavaScript
我面试过的那些烂技术大哥
我并不是一个HR,可是我面试过很多人。有年轻的,有年长的,形形色色。 在不同的年纪和岗位上做面试官的内心感觉是不一样的。下面我来讲讲,我做面试官时的一些体验。

相关实验场景

更多