• (14)线程- Event事件和守护线程Daemon


     

    <一>Event事件

    线程Event基本和进程的Event语法是一样的

    # wait() 动态给程序加阻塞

    # set() 将内部属性改成True

    # clear() 将内部属性改成False

    # is_set() 判断当前属性(默认是False)

    e = Event()

    print(e.is_set())

    # timeout = 5 最多等待5秒

    e.wait(timeout = 5) # 简写 e.wait(5) 进程里面亦可以这样写

    print(e.is_set())

    例:模拟连接数据库,超时主动抛异常

    from threading import Event, Thread
    import time, random
    
    def check(e):
        print("开始检测数据库连接")
        time.sleep(random.randrange(1, 6))
        e.set()
    
    def connect(e):
        sign = False
        for i in range(3):
            e.wait(1)
            if e.is_set():
                sign = True
                print("数据库连接成功")
                break
            else:
                print("尝试连接数据库%s次失败" % (i + 1))
    
        if sign == False:
            # 主动抛出异常
            raise TimeoutError
    
    e = Event()
    Thread(target=connect, args=(e,)).start()
    Thread(target=check, args=(e,)).start()
    View Code

    执行结果:

    开始检测数据库连接
    尝试连接数据库1次失败
    尝试连接数据库2次失败
    数据库连接成功
    View Code

    <二> 守护线程

    语法: 和守护进程不一样,作用也不一样,守护进程实际守护的是主进程

             对象.setDaemon(True)

    例:和守护进程不一样,守护线程实际守护的是其他子进程,伴随其他子线程的结束而结束

    from threading import Thread
    import time
    def func1():
        while True:
            time.sleep(0.5)
            print(111)
    def func2():
        print("func2 start->")
        time.sleep(2)
        print("func2 end->")
    t1 = Thread(target=func1)
    t2 = Thread(target=func2)
    # setDaemon 将普通线程变成守护线程
    t1.setDaemon(True)
    t1.start()
    t2.start()
    print("主线程代码结束")
    View Code

    执行结果: 

    func2 start->
    主线程代码结束
    111
    111
    111
    111
    func2 end->
    View Code

     

  • 相关阅读:
    MATLAB2019a安装
    每日日报6
    HTML表格
    HTML常见表单元素
    HTML特殊符号
    CTF-WEB:攻防世界-bug(综合应用)
    CTF-WEB:文件上传和 webshell
    CTF-WEB:BurpSuite 工具应用
    CTF-WEB:后台扫描与备份泄露
    CTF-WEB:PHP 伪协议
  • 原文地址:https://www.cnblogs.com/lyj910313/p/10787327.html
Copyright © 2020-2023  润新知