zoukankan      html  css  js  c++  java
  • Python的学习之旅———线程 事件

    事件

    同进程的一样

    线程的一个关键特性是每个线程都是独立运行且状态不可预测。如果程序中的其 他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变得非常棘手。为了解决这些问题,我们需要使用threading库中的Event对象。 对象包含一个可由线程设置的信号标志,它允许线程等待某些事件的发生。在 初始情况下,Event对象中的信号标志被设置为假。如果有线程等待一个Event对象, 而这个Event对象的标志为假,那么这个线程将会被一直阻塞直至该标志为真。一个线程如果将一个Event对象的信号标志设置为真,它将唤醒所有等待这个Event对象的线程。如果一个线程等待一个已经被设置为真的Event对象,那么它将忽略这个事件, 继续执行

     1 from threading import Thread,Event
     2 import threading
     3 import time,random
     4 def conn_mysql():
     5     count=1
     6     while not event.is_set():
     7         if count > 3:
     8             raise TimeoutError('链接超时')
     9         print('<%s>第%s次尝试链接' % (threading.current_thread().getName(), count))
    10         event.wait(0.5)
    11         count+=1
    12     print('<%s>链接成功' %threading.current_thread().getName())
    13 
    14 
    15 def check_mysql():
    16     print('33[45m[%s]正在检查mysql33[0m' % threading.current_thread().getName())
    17     time.sleep(random.randint(2,4))
    18     event.set()
    19 if __name__ == '__main__':
    20     event=Event()
    21     conn1=Thread(target=conn_mysql)
    22     conn2=Thread(target=conn_mysql)
    23     check=Thread(target=check_mysql)
    24 
    25     conn1.start()
    26     conn2.start()
    27     check.start()

    event.is_set()   默认是 False  在event.set()执行完毕之后,变为True 

    event.wait(0.5)  中止程序进行,直到 event.set() 执行 ,event.wait(0.5)就变为非阻塞态 ,活着 0.5超时。

    event.set()  设置event的状态为True 所有阻塞池的线程激活进入就绪状态。

    event.clear 恢复even 的状态为False

  • 相关阅读:
    有限制的最大连续和问题
    Codevs 5056 潜水员
    Codevs 1958 刺激
    Codevs 3731 寻找道路 2014年 NOIP全国联赛提高组
    [NOIP2014]解方程
    Codevs 3729 飞扬的小鸟
    Codevs 1689 建造高塔
    Codevs 2102 石子归并 2
    C语言基础之进制的那些事(1)
    指针
  • 原文地址:https://www.cnblogs.com/surehunter/p/7890431.html
Copyright © 2011-2022 走看看