在python使用Lock 机制
from multiprocessing import Process, Value, Lock
import time
# Value 是实现进程之间的共用问题
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_money(num, l):
l.acquire() # 上锁
for i in range(100):
num.value += 1
print(num.value)
time.sleep(0.01)
l.release() # 开锁
if __name__ == '__main__':
num = Value('i', 100)
l = Lock()
gp = Process(target=get_money, args=(num, l))
gp.start()
pp = Process(target=put_money, args=(num, l))
pp.start()
gp.join()
pp.join()
print('主进程:', num.value)
在python使用Semaphore机制
1.信号量机制比锁机制多了一个计数器,
这个计数器是用来记录当前剩余几把钥匙的。
2.当计数器为0时,表示没有钥匙了,此时acquire()处于阻塞。
3.对于计数器来说,每acquire一次,计数器内部就减1,release一次,计数器就加1
from multiprocessing import Process, Semaphore
import time
import random
def func(i, sem):
sem.acquire()
print('第%s个人进入小黑屋,拿了钥匙锁上门' % i)
time.sleep(random.randint(3, 5))
print('第%s个人出去小黑屋,还了钥匙打开门' % i)
sem.release()
if __name__ == '__main__':
# 初始化了一把锁5把钥匙,也就是说允许5个人同时进入小黑屋
# 之后其他人必须等待,等有人从小黑屋出来,还了钥匙,才能允许后边的人进入
sem = Semaphore(5)
for i in range(20):
p = Process(target=func, args=(i, sem,))
p.start()
在python使用Event机制
1.事件是通过is_set()的bool值,去标识e.wait() 的阻塞状态
2.当is_set()的bool值为False时,e.wait()是阻塞状态
3.当is_set()的bool值为True时,e.wait()是非阻塞状态
4.当使用set()时,是把is_set的bool变为True
5.当使用clear()时,是把is_set的bool变为False
from multiprocessing import Process, Event
import time
import random
def tra(e):
while 1:# 红绿灯得一直亮着,要么是红灯要么是绿灯
if e.is_set():# True,代表绿灯亮,那么此时代表可以过车
time.sleep(5) # 所以在这让灯等5秒钟,这段时间让车过
print('\033[31m 红灯亮! \033[0m') # 绿灯亮了5秒后应该提示到红灯亮
e.clear() # 把is_set设置为False
else:
time.sleep(5) # 此时代表红灯亮了,此时应该红灯亮5秒,在此等5秒
print('\033[32m 绿灯亮! \033[0m') # 红的亮够5秒后,该绿灯亮了
e.set()# 将is_set设置为True
def mycar(i, e):
e.wait() # 车等在红绿灯,此时要看是红灯还是绿灯,如果is_set为True就是绿灯,此时可以过车
print('第%s辆车过去了' % i)
if __name__ == '__main__':
e = Event()
triff_light = Process(target=tra, args=(e,))# 信号灯的进程
triff_light.start()
for i in range(50): # 信号灯的进程
if i % 3 == 0:
time.sleep(2)
car = Process(target=mycar, args=(i + 1, e,))
car.start()
网友评论