锁机制:
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()