zoukankan      html  css  js  c++  java
  • 关于锁、信号量、及事件机制

    锁机制:

    l=Lock()

    一把锁配一把钥匙

    拿钥匙,锁门 l.acquire()

    换钥匙,开门l.release()

    from multiprocessing import Process,Lock
    import time
    
    def check(i):
        with open('1')as f:
            c=f.read()
        print('%s查到还剩%s张余票'%(i,c))
    def buy(i,l):
       l.acquire()
       with open('1')as f:
           c = int(f.read())
           time.sleep(0.1)
       if c>0:
          print('33[31m %s买到了一张票33[0m'%i)
          time.sleep(0.1)
          c-=1
       else:
           print('33[32m 尊敬的%s,余票已不足,请查询其他车次 33[0m'%i)
       with open('1','w')as f:
           f.write(str(c))
           time.sleep(0.1)
       l.release()
    
    if __name__ == '__main__':
        l=Lock()
        lst_name=['张三','李文达','达文西','alex','wisir','coco','jack','tony']
        lis=[]
        liss=[]
        for i in lst_name:
            p=Process(target=check,args=(i,))
            p.start()
            lis.append(p)
        for i in lst_name:
            p1=Process(target=buy,args=(i,l))
            p1.start()
            liss.append(p1)
        [ss.join() for ss in lis]
        [ss.join() for ss in liss]
    

      

    信号机制:

    sem=Semaphore(n)

    n:是指初始化一把锁配几把钥匙,一个int型

    拿钥匙,锁门  sem.acquire()

    还钥匙,开门 sem.release()

    信号量机制比锁机制多了一个计数器,这个计数器是用来记录当前剩余几把钥匙的

    当计数器为0时,表示没有钥匙了,此时的acquire()处于阻塞

    对于计数器来说,每acquire一次,计数器内部就减一,release一次,计数器就加一

    from   multiprocessing import Process,Semaphore
    import time
    import random
    
    def spa(sam,i):
        sam.acquire()
        print('第%s顾客进去了'%(i+1))
        time.sleep(random.randint(3,5))
        print('第%s顾客出来了' % (i + 1))
        sam.release()
    
    
    
    if __name__ == '__main__':
        sam=Semaphore(5)
        for i in range(20):
    
            p=Process(target=spa,args=(sam,i))
            p.start()
    

      

    事件机制

    e=Event()

    e.set()#将is_set()设为True

    e.clear() # 将is_set()设为False

    e.wait()#判断is_set的bool值,如果bool为True,则非阻塞,bool值为False,则阻塞

    e.is_set()

    # 事件是通过is_set()的bool值,去标识e.wait() 的阻塞状态
    # 当is_set()的bool值为False时,e.wait()是阻塞状态
    # 当is_set()的bool值为True时,e.wait()是非阻塞状态
    # 当使用set()时,是把is_set的bool变为True
    # 当使用clear()时,是把is_set的bool变为False

    from multiprocessing import Process,Event
    import time
    
    def traffic(e):
        e.set()
        while 1:
            if e.is_set():
                print('33[32m 绿灯亮 33[0m ')
                time.sleep(5)
                # print('33[31m 红灯亮 33[0m ')
                e.clear()
            else:
                print('33[31m 红灯亮 33[0m ')
                time.sleep(5)
                # print('33[32m 绿灯亮 33[0m ')
                e.set()
    
    def Car(i,e):
        e.wait()
        print('第%s辆车过去了'%(i+1))
        time.sleep(1)
    
    if __name__ == '__main__':
        e=Event()
        t=Process(target=traffic,args=(e,))
        t.start()
        for i in range(40):
            print(i)
            c=Process(target=Car,args=(i,e))
            c.start()
            c.join()
        t.terminate()
    

      

  • 相关阅读:
    Vue内置指令
    Vue计算属性
    Ubuntu下编译Bilibili/ijkplayer
    自毁程序
    Android最大可运行内存
    Android ListView onItemClick Not Work
    Java/Android 二进制数据与String互转
    JAVA/Android Map与String的转换方法
    java中打印变量地址
    Win7 关闭Window update
  • 原文地址:https://www.cnblogs.com/wszxdzd/p/9519254.html
Copyright © 2011-2022 走看看