锁机制
防止数据混乱 , 保护对进程的数据安全性
锁涉及两个操作:
拿钥匙锁门 ------- 不让别人进屋 ( 其它 进程若想 进屋 要在外边等待 , 等其出来后还回钥匙,才能进去 )
还钥匙 开门 ------- 让别人进屋
from multiprocessing import Lock 先要导入模块
l = Lock() 实例化一个锁机制 即对象锁 不用传参数 这把锁只有一把钥匙
l.acquire() 锁门 拿走钥匙, 不让别人进屋
l.release() 还回钥匙开门 , 允许别人进屋
补充一个模块 Value
num = Value( ‘ i ‘ , 100 ) # 将数据 100 共享 在父进程和子进程中共享 都可以对其进行操作
e.g 银行存取钱问题
from multiprocessing import Proces , Value ,Lock
import time
def get_money( num , l ): # 取钱 函数
l.acquire() # 锁门
for i in range(100):
num.value -= 1
print( num.value )
time . sleep(0.01)
l.release() # 开门
def put_mooney( num, l ): # 存钱 函数
l.acquire() # 锁门
for i in range(100):
num.value += 1
print( num.value )
l.relaese() # 开门
if __name__ == ‘ __main__ ‘ :
num = Value( ‘ i ‘ , 100 ) # 实例化一个 共享的 数据
l = Lock() # 实例化一个 一把钥匙的 锁
p = Process ( target = get_money , args = ( num , l ) )
p.start() # 开启 取钱 进程
p1 = Process ( target = put_money , args = ( num, l ) )
p1.start() # 开启 存钱的进程
p.join()
p1.join() 异步变同步
print(num.value)
e.g 模拟 12306 抢票 机制
from multiprocessing imort Process , Lock
import time
def check( i ): # 查票 直接读取文件即可
with open ( ‘ 余票 ‘ ) as f:
con = f.read()
print( ‘ 第%s个人 查到还剩 %s张票 ‘ % ( i , con ))
def buy_check( i, l ): # 买票 , 先读 锁门 若有票再买 ,买完 文件中票数减一 再将剩余的 票数 写回文件中
l.acquire()
with open( ‘ 余票 ‘ ) as f:
con = int ( f.read() )
time.sleep( 0.1 )
if con > 0:
print( ‘ \033[ 31m 第%s个人 买到票了 \033[0m ‘ % i )
con -= 1
else :
print( ‘ \033[32m 第%s个人没有买到票 \033[0m ‘ % 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_ch = Process( target = check , args = ( i +1 ,) )
p_ch . start()
for i in range(10):
p_buy = Process( target = buy_check , args = ( i +1 ,) )
p_buy . start()
信号机制
一把锁 可以有 多把钥匙 比锁机制 多了一个计数器
from multiprocessing import Semaphore
l = Semaphore( num ) 初始化 一个 有 num把钥匙的 锁 int 类型
num 是钥匙的 数量 是个计数器
l .acquire() 每多一个 num数量会减一 , 当 num为零的时候
处于阻塞状态 其他的 需要等待 还回一把钥匙才能进一个
l.release() 每多一个 num数量会 加一
e.g 模拟发廊
事件机制
from multiprocessing import Event
e = Event()
e.wait() 判断 e.is_set() 是True 还是 False
e.is_set() 当其为 True 的时候 处于非阻塞状态
False 的时候 处于阻塞状态 一般 实例化事件后 默认是 False
e.set() 将 e.is_set() 变为 True
e.clear() 将 e.is_set() 变为 False
e.g
e.g 红绿灯
原文地址:https://www.cnblogs.com/lynysy/p/9512477.html