zoukankan      html  css  js  c++  java
  • (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

     

  • 相关阅读:
    python网络编程学习笔记(3):socket网络服务器
    Python编码爬坑指南
    ROT13 维基百科,自由的百科全书
    ZODB + Traversal Wiki Tutorial¶
    ZODB programming guide¶
    利用新浪api获取ip归属地 QtSharp 博客园
    用python做了个桌球瞄准器
    Python运维工具介绍1–fabric
    python httplib2 使用代理出错
    第四回 基类中的修饰符,应该根据你对架构的理解去定义它们,没有绝对的
  • 原文地址:https://www.cnblogs.com/lyj910313/p/10787327.html
Copyright © 2011-2022 走看看