day36----锁机制,信号机制,事件机制,生产者消费者模型
1.锁机制----------Lock模块
l = Lock()
l.acquire() 拿钥匙,锁门.别的程序无法操作
l.release() 还钥匙,开门.允许其他进程操作
from multiprocessing import Process,Lock -----------------------导入Process,Lock模块
import time -----------------------导入time模块
def cherk(i): -----------------------定义一个函数 cherk() 查询还剩余多少余票
with open("车票") as f:
con = f.read()
print("第%s个人查到还剩余%s张车票" % (i,con))
def buy_ticket(i,l): -----------------------定义一个函数,进行购票操作
l.acquire() ---------------------- 将购买票的操作上锁,此进程在购票过程其他进程无法进行操作
with open("车票") as f:
con = int(f.read())
time.sleep(0.1)
if con> 0 : -----------------------先检查是否剩余车票,车票还有剩余可以进行购票
print("第%s个人,买到票了" % i)
con -= 1
else:
print("第%s个人,没有买到票" % i)
time.sleep(0.1)
with open("车票","w") as f:
f.write(str(con))
l.release()
if __name__ == '__main__': --------------------- 当新建进程的时候,此下面的代码不会被执行
l = Lock() -------------------- 实例化一个锁子
for i in range(10): -------------------- 循环创建进程,进行查询过程
p_cherk = Process(target=cherk,args=(i+1,))
p_cherk.start()
for el in range(10): --------------------- 循环创建进程,进行购票操作
p_buy = Process(target=buy_ticket,args=(el+1,l))
p_buy.start()
2.信号量-------Semphore
sem = Semphore(5) 5表示可以有5个进程同时进行操作数据,而后面的进程必须等待前面的数据执行结束才可以进来
from multiprocessing import Process,Semaphore ------------------------------------------- 导入模块 Process,Semphore
import time ------------------------------------------- 导入模块 time
import random ------------------------------------------- 导入模块 random
def func(i,sem): ------------------------------------------ 定义一个函数 func()
sem.acquire() ------------------------------------------ 拿钥匙####sem已经定义过可以有几个进程同时进来
print('第%s个人进入小黑屋,拿了钥匙锁上门' % i)
time.sleep(random.randint(3,5))
print('第%s个人出去小黑屋,还了钥匙打开门' % i)
sem.release() ------------------------------------------- 还钥匙#### 有进程结束之后,归还钥匙,其他进程才可以进来操作
if __name__ == '__main__':
sem = Semaphore(5)# 初始化了一把锁5把钥匙,也就是说允许5个人同时进入小黑屋 ------------------ 实例化Semaphore
# 之后其他人必须等待,等有人从小黑屋出来,还了钥匙,才能允许后边的人进入
for i in range(20):
p = Process(target=func,args=(i,sem,)) ------------------- 循环生成进程,并且将参数 i,sem 传递给函数func
p.start()
3.事件 ------------- 模块Event
e = Event() 四个方法: e.set() 修改 e.is_set 为True e.clear 修改 e.is_set 为False e.wait() 判断e.is_set 是True还是False, True继续执行 False救会停止
from multipressing import Event --------------------------------- 导入Event模块
e = Event() --------------------------------- 实力化一个Event的对象
print(e.is_set()) --------------------------------- 查看一下e.is_set() 状态是True还是False
e.set() --------------------------------- 将e.is_set() 设置成为True,e.wait()此时是非阻塞状态.(默认是False,阻塞状态)
e.wait() --------------------------------- 判断状态,继续执行还是停止执行
print(e.is_set()) --------------------------------- 打印状态
print(123) -------------------------------- 输出123
e.clear() -------------------------------- 将e.is_set() 设置成为False,阻塞状态.
print(e.is_set())
e.wait()
print(123)