(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

 

原文地址:https://www.cnblogs.com/lyj910313/p/10787327.html