zoukankan      html  css  js  c++  java
  • python_day10 event

    同进程的一样

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

    ############基本操作

    event.isSet():返回event的状态值;

    event.wait():如果 event.isSet()==False将阻塞线程;

    event.set(): 设置event的状态值为True,所有阻塞池的线程激活进入就绪状态, 等待操作系统调度;

    event.clear():恢复event的状态值为False。

    from threading import Thread,Event
    import threading
    import time,random
    def conn_mysql():
        print('33[42m%s 等待连接mysql。。。33[0m' %threading.current_thread().getName())
        event.wait()
        print('33[42mMysql初始化成功,%s开始连接。。。33[0m' %threading.current_thread().getName())
    
    
    def check_mysql():
        print('33[41m正在检查mysql。。。33[0m')
        time.sleep(random.randint(1,3))
        event.set()
        time.sleep(random.randint(1,3))
    
    if __name__ == '__main__':
        event=Event()
        t1=Thread(target=conn_mysql) #等待连接mysql
        t2=Thread(target=conn_mysql) #等待连接myqsl
        t3=Thread(target=check_mysql) #检查mysql
    
        t1.start()
        t2.start()
        t3.start()

    threading.Event的wait方法还接受一个超时参数,默认情况下如果事件一致没有发生,wait方法会一直阻塞下去,而加入这个超时参数之后,如果阻塞时间超过这个参数设定的值之后,wait方法会返回。对应于上面的应用场景,如果Redis服务器一致没有启动,我们希望子线程能够打印一些日志来不断地提醒我们当前没有一个可以连接的Redis服务,我们就可以通过设置这个超时参数来达成这样的目的:

    def conn_mysql():
        count=0
        while not e.is_set():
            print('%s 第 <%s> 次尝试' %(threading.current_thread().getName(),count))
            count+=1
            e.wait(0.5)
        print('%s ready to conn mysql' %threading.current_thread().getName())
        time.sleep(1)

    from threading import Thread,Event
    import threading
    import time,random
    def conn_mysql():
    while not event.is_set():
    print('33[42m%s 等待连接mysql。。。33[0m' %threading.current_thread().getName())
    event.wait(0.1)
    print('33[42mMysql初始化成功,%s开始连接。。。33[0m' %threading.current_thread().getName())


    def check_mysql():
    print('33[41m正在检查mysql。。。33[0m')
    time.sleep(random.randint(1,3))
    event.set()
    time.sleep(random.randint(1,3))

    if __name__ == '__main__':
    event=Event()
    t1=Thread(target=conn_mysql)
    t2=Thread(target=conn_mysql)
    t3=Thread(target=check_mysql)

    t1.start()
    t2.start()
    t3.start()

    修订上述mysql版本

    $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$定时器

    几秒后 执行

    from threading import Timer
     
     
    def hello():
        print("hello, world")
     
    t = Timer(1, hello)
    t.start()  # after 1 seconds, "hello, world" will be printed
  • 相关阅读:
    使用某些 DOCTYPE 时会导致 document.body.scrollTop 失效
    VB.NET 笔记1
    知识管理系统Data Solution研发日记之一 场景设计与需求列出
    知识管理系统Data Solution研发日记之五 网页下载,转换,导入
    折腾了这么多年的.NET开发,也只学会了这么几招 软件开发不是生活的全部,但是好的生活全靠它了
    分享制作精良的知识管理系统 博客园博客备份程序 Site Rebuild
    知识管理系统Data Solution研发日记之四 片段式数据解决方案
    知识管理系统Data Solution研发日记之二 应用程序系列
    知识管理系统Data Solution研发日记之七 源代码与解决方案
    知识管理系统Data Solution研发日记之三 文档解决方案
  • 原文地址:https://www.cnblogs.com/onda/p/7111553.html
Copyright © 2011-2022 走看看