锁Lock,信号量Semaphore,事件机制Event

银行取钱
from multiprocessing import Process,Lock,Value
import time
def get_money(num):
    for i in range(100):
        num.value -= 1
        time.sleep(0.01)
def put_money(num):
    for i in range(100):
        num.value += 1
        time.sleep(0.01)
if __name__ == '__main__':
    num = Value("i",100)
    p_g = Process(target=get_money,args=(num,))
    p_g.start()
    p_p = Process(target=put_money,args=(num,))
    p_p.start()
    p_g.join()
    p_p.join()
    print(num.value)

加锁
from multiprocessing import Process,Lock,Value
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_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()
    p_g = Process(target=get_money,args=(num,l))
    p_g.start()
    p_p = Process(target=put_money,args=(num,l))
    p_p.start()
    p_g.join()
    p_p.join()
    print(num.value)
12306抢票
from multiprocessing import Process,Lock
import time
def check_ticket(i):
    with open("余票")as f:
        num = f.read()
    print("第%s个人查到剩余%s张票" % (i,num))
def buy_ticket(i,):
    with open("余票")as f:
        num = int(f.read())
        time.sleep(0.1)
    if num > 0:
        print("\033[32m第%s个人买到了票\033[0m" % i)
        num -= 1
    else:
        print("\033[35m第%s个人没有买到了票\033[0m" % i)
    time.sleep(0.1)
    with open("余票","w")as f:
        f.write(str(num))
if __name__ == '__main__':
    for i in range(10):
        p_c = Process(target=check_ticket,args=(i+1,))
        p_c.start()
    for i in range(10):
        p_b = Process(target=buy_ticket,args=(i+1,))
        p_b.start()


加锁
from multiprocessing import Process,Lock
import time
def check_ticket(i):
    with open("余票")as f:
        num = f.read()
    print("第%s个人查到剩余%s张票" % (i,num))
def buy_ticket(i,l):
    l.acquire()
    with open("余票")as f:
        num = int(f.read())
        time.sleep(0.1)
    if num > 0:
        print("\033[32m第%s个人买到了票\033[0m" % i)
        num -= 1
    else:
        print("\033[35m第%s个人没有买到了票\033[0m" % i)
    time.sleep(0.1)
    with open("余票","w")as f:
        f.write(str(num))
    l.release()
if __name__ == '__main__':
    l = Lock()
    for i in range(10):
        p_c = Process(target=check_ticket,args=(i+1,))
        p_c.start()
    for i in range(10):
        p_b = Process(target=buy_ticket,args=(i+1,l))
        p_b.start()

信号量

from multiprocessing import Semaphore,Lock
l = Semaphore(3)
l.acquire()  #拿走钥匙,锁门
print(123)
l.acquire()
print(456)
l.release()  #还回钥匙,供其他人开门
print(654)
l.acquire()
print(789)
l.release()
print(321)
排队上大号
from multiprocessing import Process,Semaphore
import time
import random
def func(i,s):
    s.acquire()
    print("\033[31m 第%s个人进卫生间 \033[0m" % i)
    time.sleep(random.randint(2,5))
    print("\033[32m 第%s个人出卫生间 \033[0m" % i)
    s.release()
if __name__ == '__main__':
    s = Semaphore(5)#初始化卫生间可以供5个人同时使用
    for i in range(20):
        p = Process(target=func,args=(i+1,s))
        p.start()

事件机制

from multiprocessing import Event
e = Event()
e.is_set()
print(e.is_set())
e.wait()
print(123)
结果:False

from multiprocessing import Event
e = Event()
e.is_set()
print(e.is_set())
e.set()
e.wait()
print(e.is_set())
print(123)
结果:
False
True
123

from multiprocessing import Event
e = Event()
e.is_set()
print(e.is_set())
e.set()
e.wait()
print(e.is_set())
print(123)
e.clear()
print(e.is_set())
e.wait()
print(123)
结果:
False
True
123
False

总结:
事件是通过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变为False
模拟红绿灯
from multiprocessing import Process,Event
import time
def light(e):
    '''红绿灯函数'''
    while 1: #红绿灯循环亮
        if e.is_set(): #True 绿灯亮着,可以通车
            time.sleep(5) #绿灯亮灯时间为5秒
            print("\033[31m 红灯亮! \033[0m")  #5秒后,红灯亮
            e.clear() #将is_sent设置为False,
        else:
            time.sleep(5)  #红灯亮灯时间为5秒
            print("\033[32m 绿灯亮 \033[0m") #5秒后,绿灯亮
            e.set() #将is_set设置为True
def car(i,e):
    e.wait() #等待灯的指示,如果is_set为True,通车,反之,停车等待
    print("第%s辆车通过了红灯" %i)
if __name__ == '__main__':
    e = Event()
    l = Process(target=light,args=(e,))
    l.start()
    for i in range(50):
        if i %3 ==0:
            time.sleep(2)
        c = Process(target=car,args=(i+1,e))
        c.start()

 

posted @ 2018-08-21 15:36  chenyibai  阅读(282)  评论(0编辑  收藏  举报