python学习笔记 day39 事件---线程

1. 事件

其实就是一种标志,事件默认阻塞状态,阻塞状态下执行e.wait()就会一直陷入阻塞状态(但是e.wait(10)就是设置在阻塞状态下 e.is_set()=False时只阻塞10秒就结束) ;

e.set()  设置非阻塞状态,此时e.is_set()=True 并且执行e.wait()不会陷入阻塞 e.wait()对于e.is_set()=True时是没有任何作用的;

2. 开线程模拟连接数据库:

需求是: 先开一个线程检查数据库连接是否正常(比如网是否连接)就是使用time.sleep()随机睡几秒(1-3秒之间),然后设置事件的状态e.set() 然后开一个线程去执行数据库连接的操作(尝试连接,超过次数就说明连接失败)这个检查次数肯定是跟事件的状态有关的,每0.5秒检查一次事件的状态,一共检查三次,所以总共连接数据库的机会是3秒,如果数据库检查连接 随机睡的时间是1.5以内,就会在1.5之内把事件的状态设置为非阻塞,那么链接数据库需要1.5秒的这段时间就可以让跳出循环,执行连接成功:

from threading import Thread
from threading import Event
import time
import random
def conn_Mysql():  # 链接数据库
    count=0
    try:
        while not e.is_set():  # 判断事件的状态,如果咋1.5秒以内检查数据库(check_conn0)的操作可以把e.set()设置上,就可以跳出循环,也就是连接成功
            if count>=3:  # check_conn 睡超过1.5秒,没来得及让事件变为非阻塞,这里循环了三次耗时1.5秒,就会抛出异常
                raise TimeoutError
            else:
                count += 1
                # time.sleep(0.5)
                print("尝试连接第%s次"%count)
                e.wait(0.5)  # 一直阻塞变为只阻塞0.5秒   wait()只有在事件是阻塞状态时才会 进入阻塞状态,e.set()之后在执行e.wait()是没有任何效果的
        print("连接成功")
    except TimeoutError:
        print("连接失败")

def check_conn():
    time.sleep(random.randint(1,3))  # 随机睡,如果事件在1.5秒以内,就可以有机会设置事件非阻塞状态,因为conn_Mysql最多需要三次机会,一共1.5秒
    e.set()
e=Event()
t2=Thread(target=check_conn)
t2.start()
t=Thread(target=conn_Mysql)
t.start()

运行结果:

talk is cheap,show me the code
原文地址:https://www.cnblogs.com/xuanxuanlove/p/9792323.html