锁机制,信号机制,事件机制,生产者消费者模型

本文深入探讨了并发编程中的锁机制、信号量和事件机制。通过具体示例介绍了如何使用Python的multiprocessing模块来实现进程间的同步,包括锁的使用、信号量的限制并发数目的作用及事件对象的状态控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)














转载于:https://www.cnblogs.com/kcwxx/p/9511899.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值