关于锁、信号量、及事件机制

锁机制:

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('\033[31m %s买到了一张票\033[0m'%i)
      time.sleep(0.1)
      c-=1
   else:
       print('\033[32m 尊敬的%s,余票已不足,请查询其他车次 \033[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('\033[32m 绿灯亮 \033[0m ')
            time.sleep(5)
            # print('\033[31m 红灯亮 \033[0m ')
            e.clear()
        else:
            print('\033[31m 红灯亮 \033[0m ')
            time.sleep(5)
            # print('\033[32m 绿灯亮 \033[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()

  

 

posted @ 2018-08-22 17:43  浮云遮月  阅读(464)  评论(0编辑  收藏  举报