zoukankan      html  css  js  c++  java
  • day49-线程-事件

    #1、Event里面有一个标志flag,当e = Event()刚创建的时候,flag=False,阻塞,这个时候,e.is_set()也是等于False,阻塞。
    #e.set()让flag变成非阻塞,e.clear()让flag变成阻塞。
    #e.wait() 当flag=True,非阻塞;当flag=False,阻塞。
    
    #2、例子:模拟连接mysql数据库,设置连接三次,每0.5秒连接一次,如果连接成功,打印出成功,否则就报错。
    
    from threading import Thread
    from threading import Event
    import time
    import random
    def conn(e):
        count = 1
        while not e.is_set(): #e.is_set()刚创建的时候是False,所以这里是while True的意思。
            if count > 3:
                raise TimeoutError #连接大于3次,抛出超时错误。
            print('连接第%s次'%count)
            count += 1
            e.wait(0.5) #每次连接都是等待0.5秒。那么2次连接就是1秒,因为下面的e.set()是1秒之后执行,那么
        print('连接成功')#当下面检测1秒并且conn比check先执行的情况下,可以连接三次才打印成功;如果
    #                     同时执行,只连接两次就打印成功。当下面检测2秒,就会抛出错误。
    
    def check(e):
        time.sleep(random.randint(1,2)) #模拟检测数据库连接是否正常(省略了n行代码),检测使用了1或2秒
        e.set()       #1秒以后,变成非阻塞。
    
    e = Event()
    t = Thread(target=conn,args=(e,))
    t.start()
    t1 = Thread(target=check,args=(e,))
    t1.start()
    #有三种结果:
    # 连接第1次
    # 连接第2次
    # 连接成功
    
    # 连接第1次
    # 连接第2次
    # 连接第3次
    # TimeoutError
    
    # 连接第1次
    # 连接第2次
    # 连接第3次
    # 连接成功
  • 相关阅读:
    python之路-随笔 python处理excel文件
    eclipse添加注释
    junit单元测试
    【FLEX教程】#008 开发中的问题笔记(慢更…)
    【FLEX教程】#007 如何让JS调用SWF里的方法
    【总结】2014年度总结
    【转】#100 代码运行框
    【实战项目】【FLEX】#900 实现拖控件功能
    【教程】【FLEX】#006 控件位置的拖动
    【教程】【FLEX】#005 拖动
  • 原文地址:https://www.cnblogs.com/python-daxiong/p/12142796.html
Copyright © 2011-2022 走看看