锁
from multiprocessing import Lockl = Lock()l.acquire()# 拿走钥匙,锁门,不让其他人进屋l.release()# 释放锁。 还钥匙,开门,允许其他人进屋
#执行一个进程的时候不允许其他进程一起执行举例:两个人在银行共同存钱取钱
from multiprocessing import Process,Value,Lock
import timedef get_money(num,l):# 取钱l.acquire()# 拿走钥匙,锁上门,不允许其他人进屋for i in range(100):num.value -= 1print(num.value)time.sleep(0.01)l.release()# 还钥匙,打开门,允许其他人进屋def put_money(num,l):# 存钱l.acquire()for i in range(100):num.value += 1print(num.value)time.sleep(0.01)l.release()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)Value 进程间共享数据
信号量
from multiprocessing import Semaphore,Lockl = Semaphore(4) #一把锁对应多把钥匙,参数是几代表几把钥匙,没有钥匙的进程只有等其他进程还了钥匙才能继续执行l.acquire()# 拿走1把钥匙,锁上门
print(123)
l.acquire()# 拿走1把钥匙,锁上门
print(456)
l.acquire()# 拿走1把钥匙,锁上门
print(789)
# l.release()
l.acquire()# 拿走1把钥匙,锁上门
print(120)举例:5个小黑屋,20个人进
from multiprocessing import Process,Semaphore
import time
import randomdef func(i,sem):sem.acquire()print('第%s个人进入小黑屋,拿了钥匙锁上门' % i)time.sleep(random.randint(3,5))print('第%s个人出去小黑屋,还了钥匙打开门' % i)sem.release()if __name__ == '__main__':sem = Semaphore(5)# 初始化了一把锁5把钥匙,也就是说允许5个人同时进入小黑屋# 之后其他人必须等待,等有人从小黑屋出来,还了钥匙,才能允许后边的人进入for i in range(20):p = Process(target=func,args=(i,sem,))p.start()
事件机制
from multiprocessing import Evente = Event()
# e.set()
# e.clear()
# e.wait()
# 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变为Falseprint(e.is_set())# False wait应该是阻塞住
e.set()# 将is_set 的bool值变为True,将wait变为非阻塞
e.wait()
print(e.is_set())
print(123)
e.clear()
print(e.is_set())
e.wait()
print(123)举例:信号灯模拟,红灯亮不允许车辆通过,绿灯通过
from multiprocessing import Process,Event
import time
import randomdef tra(e):'''信号灯函数'''# e.set()# print('\033[32m 绿灯亮! \033[0m')while 1:# 红绿灯得一直亮着,要么是红灯要么是绿灯if e.is_set():# True,代表绿灯亮,那么此时代表可以过车time.sleep(5)# 所以在这让灯等5秒钟,这段时间让车过print('\033[31m 红灯亮! \033[0m')# 绿灯亮了5秒后应该提示到红灯亮e.clear()# 把is_set设置为Falseelse:time.sleep(5)# 此时代表红灯亮了,此时应该红灯亮5秒,在此等5秒print('\033[32m 绿灯亮! \033[0m')# 红的亮够5秒后,该绿灯亮了e.set()# 将is_set设置为Truedef Car(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):# 描述50辆车的进程if i % 3 == 0:time.sleep(2)car = Process(target=Car,args=(i+1,e,))car.start()