1,锁机制(在异步进程的时候,多个子进程访问同一个资源时,会有数据混乱的情况)
from multiprocessing import Lock
l = Lock()....................实例化一个锁的对象
l.acquire()......................拿走钥匙,锁门,不让其他人进屋(当有一个进程访问数据的时候.不允许其他进程访问)
l.release()...............释放锁,还钥匙,开门,允许其他人进屋(当上一个进程访问完这个数据的时候,才会让下一个数据进行访问)
from multiprocessing import Process, Lock,Value
import time
def get_money():.....................取钱的进程
l.acquire()...............................获取num数据的钥匙(把num的资源独自享有,不允许别的进程访问)
for i in range(100):
num.value -= 1
print("取钱:%s"%mun.value)
time.sleep(0.1)
l.release().................................等此子进程操作完毕后归还钥匙(是释放num的资源)
def put_money():
l.acquire()................................只有上一个子进程归还了钥匙(释放了公共资源)获取数据的钥匙
for i in range(100):
num.value += 1
print("存钱:%s"%num.value)
time.sleep(0.1)
l.release()
if __name__ == "__main__":
mun = Value("i",100)
l = Lock()........................实例化锁的对象(Lock其实是一个类)
p = Process(target=get_money,args=(num,l))实例化的对象然后开启子进程的函数时指定的,其他的没有,有且只有本函数一个
p.start()...............................开启一个子进程
p1 = Process(target=put_money,args=(num,l))
p.join().......................等待这个子进程结束以后再执行主程序
p1.join().......................同理
time.sleep(0.1)
print(num.value)
1.2>模仿网络购票
from multiprocessing import Process,Lock
import time
def check_ticket(i):
with open("Spare_ticket") as f:
content = f.read()
print("第%s个人查余票了,还剩%s张"%(i,content))
time.sleep(0.1)
def buy_ticket(i,l):
l.acquire()...................所的机制是一次只能一个人购票(进程访问)
with open("Spare_ticket") as f:
content = int(f.read())..........把数据库里的票数读出来
if content > 0:................此时判断数据库里的余票还有多少张
content -= 1
print("第%s个人买到票了,还剩%s张票"%(i,content))
else:
print("第%s个人没有买到票"%i)
with open("Spare_ticket","w") as f:.......在执行完买票以后,把数据库里的数据更改掉
f.write(str(content))
time.sleep(0.1)
l.release()............每次一个进程使用完一个被锁着的资源的时候,就会释放这个资源
if __name__ == "__main__":
l = Lock()................实例化锁的对象
for i in range(100):
p1 = Process(target=check_ticket,args=(i,))
p1.start()
for i in range(100):
p2= Process(target=buy_ticket,args=(i,l))
p2.start()
2,信号量机制
l = Lock()...................实例化一个锁的对象
l.acquire()..................获取锁的钥匙
l.release()....................释放钥匙(有借有还,在借不难)
l = Semaphore(4)..................实例化一个信号量的对象,括号里的参数是锁的几把钥匙,当什么都不写的时候,默认有一把钥匙,写了1也是有一把钥匙,当有四把钥匙的时候,就可以一次4个进程同时访问一个资源,无需前几个释放共有资源,其他有要访问共有资源的时候,就得等到这4个进程完事以后释放资源,在进行访问.
from multiprocessing import Process,Semaphore
import time
import random
def func(i,s)
s.acquire()..................跟锁是一样的,获取访问公共资源的权限(不过这一次获取的是5个权限)
print("\033[32m这是第%s个人进入小黑屋\033[32m"%i)...此时有5个进程同时访问共有的资源
time.sleep(random.randint(3,5))
print("这是第%s个人离开小黑屋"%i)...............此时只要有出去的进程就会有进来的进程,直到最后5个进程一起出去(有进有出,反复的一进一出)
s.release()
if __name__ == "__main__":
s = Semaphore(5)...实例化信号量的对象并配发5把钥匙(开5个进程可以访问共有资源的权限)
for i in range(10)
p = Process(target=func,args=(i.s))
p.start()
3,事件机制
from multiprocessing import Event
e = Event()
e.set().......................是把is_set的bool值变为True
e.clear()........................是把is_set的bool值变为False
e.wait()..........................是判断是否为阻塞状态
is_set()............................当bool值为True时,e.wait()是非阻塞状态
is_set()............................当bool值为False时,e.wait()是阻塞状态
from multiprocess import Process,Event
import time
def traffic(e):
print(e.is_set())
while 1:
if.is_set():
time.sleep(3)
print("\033[31m红灯亮!\0330m")
e.clear()
else:
time.sleep(3)
print("\033[32m绿灯亮\033[0m")
e.set()
def car(i,e):
e.wait()
print("第%s辆车过去了"%i)
if __name__ == "__main__":
e = Event()
tra = Process(target=traffic,args=(e,))
tra.start()
for i in range(50):
if i%3 == 0:
time.sleep(2)
c = Process(target=car,args=(i+1,e))
c.start()