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

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

摄影:产品经理某种咕咾肉

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

这个同学想实现,在代码第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)

运行效果如下图所示:

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

目录
相关文章
使用云起实验室安装Stable Diffusion报错问题的解决
因为huggingface目前国内已无法访问,按照原有的手册安装时就会报错,本文给出解决办法,以顺利完成安装和使用
3294 0
|
4月前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
531 77
|
10月前
|
Java API 网络架构
深入理解并实践响应式编程(Reactive Programming)
深入理解并实践响应式编程(Reactive Programming)
598 83
|
JavaScript 前端开发
WebView2 控件(基于 Microsoft Edge (Chromium) 的嵌入式浏览器控件),获取网页加载后的标题
在使用 WebView2 控件(基于 Microsoft Edge (Chromium) 的嵌入式浏览器控件)时,要获取网页加载后的标题,可以监听 WebView2 的 NavigationCompleted 事件。这个事件被触发时,表示导航已完成,此时执行JavaScript代码可以安全地获取网页的标题。
612 0
WebView2 控件(基于 Microsoft Edge (Chromium) 的嵌入式浏览器控件),获取网页加载后的标题
|
前端开发 开发者 C#
WPF开发者必读:MVVM模式实战,轻松实现现代桌面应用架构,让你的代码更上一层楼!
【8月更文挑战第31天】在WPF应用程序开发中,MVVM(Model-View-ViewModel)模式通过分离应用程序的逻辑和界面,提高了代码的可维护性和可扩展性。本文介绍了MVVM模式的三个核心组件:Model(数据模型)、View(用户界面)和ViewModel(处理数据绑定和逻辑),并通过示例代码展示了如何在WPF项目中实现MVVM模式。通过这种方式,开发者可以构建更加高效和可扩展的桌面应用程序。
667 0
|
安全 Java 数据安全/隐私保护
Stirling-PDF:一款优秀的开源PDF处理工具
Stirling-PDF是一个基于spring-boot开发的开源项目,旨在提供一个功能强大的基于Docker的本地托管PDF操作工具。它使您能够对PDF文件进行多种操作,包括拆分、合并、转换、重新组织、添加图片、旋转、压缩等。该本地托管应用最初由ChatGPT完全开发,并已发展成一个功能齐全的工具,可满足您的各种PDF需求。
5875 3
|
缓存 机器人 网络安全
steam报错“您对 CAPTCHA 的响应似乎无效。请在下方重新验证您不是机器人”
你是否满怀期待地准备加入 Steam 的大家庭,却被烦人的 CAPTCHA 验证拦在了门外? 😫 “您对 CAPTCHA 的响应似乎无效。请在下方重新验证您不是机器人。” 这句冰冷的提示,仿佛在嘲笑你的努力,即使反复尝试,错误依然顽固地存在,让人抓狂!🤯 别担心,你不是一个人!很多小伙伴在初次接触 Steam 时,都会遇到这个令人头疼的问题。
|
Unix API Apache
一站式解决 python打包代码,发布到pypi
本文是一份全面的Python项目打包并发布到PyPI的教程,涵盖了从PyPI账户注册、配置双因素认证、生成API Token,到准备代码、编写setup.py、选择LICENSE、构建包、上传包至PyPI,以及上传后的测试和库更新的详细步骤。
|
存储 弹性计算 数据挖掘
云计算在科研计算中的高效应用
云计算在科研计算中的高效应用
224 0
Could not connect to ‘x.x.x.x ‘(port 22): Connection failed.Failed to start sshd.service:
Could not connect to ‘x.x.x.x ‘(port 22): Connection failed.Failed to start sshd.service:
251 0