----------基础篇
这个和Lock差不多
引子
锁同时只允许一个线程更改数据,而信号量是同时允许一定数量的进程更改数据 ,用来控制对共享资源的访问数量。
假如有一下应用场景:有10个人吃饭,但只有三张餐桌,只允许做3个人,没上桌的人不允许吃饭,已上桌吃完饭离座之后,下面的人才能抢占桌子继续吃饭:
如果不用信号量,肯定是10人一窝蜂一起吃
from multiprocessing import Process
import time
import random
def fun(i):
print('{}号顾客上座,开始吃饭'.format(i))
#有人吃的快,有人吃得慢
time.sleep(random.randint(3, 8))
print('{}号顾客吃完饭了,离座'.format(i))
if __name__=='__main__':
for i in range(10):
p = Process(target=fun, args=(i,))
p.start()
结果图:
用了信号量,就要加锁,实现了轮流吃饭,每次只有3个人吃饭:
from multiprocessing import Process
from multiprocessing import Semaphore
import time
import random
def fun(i,sem):
sem.acquire()
print('{}号顾客上座,开始吃饭'.format(i))
#有人吃的快,有人吃得慢
time.sleep(random.randint(3, 8))
print('{}号顾客吃完饭了,离座'.format(i))
sem.release()
if __name__=='__main__':
sem=Semaphore(3)
for i in range(10):
p = Process(target=fun, args=(i,sem))
p.start()
结果图:
事实上,Semaphore的作用也类似于锁,只不过在锁机制上添加了一个计数器,允许多个人拥有“钥匙”。
======================================
参考文章:
python之路——进程