zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    java-日期转换
    java-Timestamp
    java-判断年份是不是闰年
    Java中Date与String的相互转换
    ORA-01830
    js数组合并
    js清空子节点
    私钥密码
    图片基本样式
    XMLHttpRequest: 网络错误 0x2ee4, 由于出现错误 00002ee4 而导致此项操作无法完成
  • 原文地址:https://www.cnblogs.com/xuanxuanlove/p/9792323.html
Copyright © 2011-2022 走看看