• python线程之condition


    cond = threading.Condition()

    # 类似lock.acquire()

    cond.acquire()

    # 类似lock.release()

    cond.release()

    # 等待指定触发,同时会释放对锁的获取,直到被notify才重新占有琐。

    cond.wait()

    # 发送指定,触发执行

    cond.notify()

    以下分别为两个线程,三个线程,四个线程。可直接看四个线程的运行过程,更加直观,有时候用文字解释不如直接实验让人理解的快。

    import threading,time
    
    cond = threading.Condition()
    #cond.acquire()
    #cond.release()
    #cond.wait()
    #cond.notify()
    def aa():
        print ('thread_aa get')
        cond.acquire()
        time.sleep(5)
        print ('thread_aa finished first job')
        cond.wait()#释放对锁的控制,好让别的进程acquire到
                   #同时阻塞在此,等待得到锁的那个进程的先cond.notify后(cond.wait或cond.release)
        print ('thread_aa get again')
        time.sleep(5)
        print ('thread_aa finished all work')
        cond.notify()#告诉刚才释放锁的那个进程等通知吧,等我要么wait要么release
        cond.release()#释放锁
    def bb():
        cond.acquire()
        print ('thread_bb get')
        cond.notify()#告诉刚才释放锁的那个进程等通知吧,等我要么wait要么release
        print ('依然是我bb在运行')
        time.sleep(5)
        print ('thread_bb finished first job')
        cond.wait()#释放对锁的控制,而后被阻塞的aa就可以执行了
                #同时阻塞在此,等待得到锁的aa的先cond.notify后(cond.wait或cond.release)
        print ('thread_aa get again')    
        print ('thread_bb finished all works')
        cond.release()
        
    a=threading.Thread(target=aa)
    a.start()
    time.sleep(2)
    b=threading.Thread(target=bb)
    b.start()
    import threading,time
    
    cond = threading.Condition()
    def aa():
        cond.acquire()
        time.sleep(1)
        print ('aa1')
        cond.wait()
        time.sleep(1)
        print ('aa2')
        cond.notify()
        cond.wait()
        print ('aa3')
        cond.notify()
        cond.wait()
        print ('aa4')
        cond.release()
    def bb():
        cond.acquire()
        print ('bb1')
        cond.wait()#没notify而直接wait,就是将对a的控制权抛出,但是自己的控
                               # 制权还在a那里,任意一个 acquire到锁的进城将得到对a的控
                                 # 制权(除非他自己又抛出),而这个acquire到锁的进程的控制
                                # 权在这个进程,如果这个进程在之后退出了,那么他控制的
                                 # 进程的控制权将转交给控制他的进程
                            
        print ('bb2')
        cond.notify()
        cond.release()
    def cc():
        cond.acquire()
        print ('cc1')
        cond.notify()
        cond.wait()
        print ('cc2')
        cond.notify()
        cond.wait()
        print ('cc3')
        cond.notify()
        cond.release()   
    a=threading.Thread(target=aa)
    a.start()
    time.sleep(2)
    b=threading.Thread(target=bb)
    b.start()
    time.sleep(2)
    c=threading.Thread(target=cc)
    c.start()
    
    '''这是三个以上版本的,或许更加直观。运行结果:
    aa1
    bb1
    cc1
    aa2
    bb2
    cc2
    aa3
    cc3
    aa4
    '''
    import threading,time
    
    cond = threading.Condition()
    def aa():
        cond.acquire()
        time.sleep(1)
        print ('aa1')
        cond.wait()
        time.sleep(1)
        print ('aa2')
        cond.wait()
        print ('aa3')
        cond.notify()
        cond.wait()
        print ('aa4')
        cond.release()
    def bb():
        cond.acquire()
        print ('bb1')
        cond.wait()
                            
        print ('bb2')
        cond.notify()
        cond.release()
    def cc():
        cond.acquire()
        print ('cc1')
        cond.notify()
        cond.wait()
        print ('cc2')
        cond.notify()
        cond.wait()
        print ('cc3')
        cond.notify()
        cond.release()
    def dd(): 
        cond.acquire()
        print ('dd1')
        cond.notify()
        cond.release()
    a=threading.Thread(target=aa)
    a.start()
    time.sleep(2)
    b=threading.Thread(target=bb)
    b.start()
    time.sleep(2)
    c=threading.Thread(target=cc)
    c.start()
    time.sleep(2)
    d=threading.Thread(target=dd)
    d.start()
    
    
    
    
    
    
    
    
    '''这是4个版本的,运行结果:
    aa1
    bb1
    cc1
    aa2
    dd1
    bb2
    cc2
    aa3
    cc3
    aa4
    '''
  • 相关阅读:
    深入理解CSS中的层叠上下文和层叠顺序
    利用CSS3制作淡入淡出动画效果
    <link>标签的rel属性全解析
    解决<pre>标签里的文本换行(兼容IE, FF和Opera等)
    HTML特殊字符大全
    清除浮动4种方法总结下
    打开wamp中的phpmyadmin出现403的错误
    js访问CSS最终计算样式
    js 正则 exec() 和 match() 数据抽取
    函数表达式中,函数名称在函数体内是只读的
  • 原文地址:https://www.cnblogs.com/saolv/p/9330740.html
Copyright © 2020-2023  润新知