进程之机制问题(锁,信号,事件)

1.进程之锁机制

  • 问题引出,进程之间不能进行资源共享,容易造成数据混乱
  • def getmoney(num):
        for i in range(100):
            num += 1
    def setmoney(num):
        for i in range(100):
            num -= 1
    if __name__ == '__main__':
        num = 100
        p = Process(target=getmoney,args=(num,))
        p1 = Process(target=setmoney,args=(num,))
        p.start()
        p1.start()
        print(num)
    进程之间数据不共享
  • def getmoney(num):
        for i in range(100):
            num.value += 1
            time.sleep(0.01)
    def setmoney(num):
        for i in range(100):
            num.value -= 1
            time.sleep(0.01)
    if __name__ == '__main__':
        num = Value('i',100)
        p = Process(target=getmoney,args=(num,))
        p1 = Process(target=setmoney,args=(num,))
        #进程p和p1相对于主进程来说是同步执行
        #执行过程中会发生数据错乱
        p.start()
        p1.start()
        #同步主进程
        p.join()
        p1.join()
        print(num.value)
    #输出结果:93

    #为什么会发生数据错乱

  • 在计算机底层计算时,i+=1 其实是先tmp=i tmp+=1 i=tmp 所以可能tmp还没赋值给i,第二个进程就来了,直接覆盖了,所以会造成数据错乱!

1.模块Lock:

 

def getmoney(num,l):
    #为程序增加锁机制,不到释放锁的时候,程序会一直停留在其中
    l.acquire()
    for i in range(100):
        num.value += 1
        time.sleep(0.01)
    l.release()
def setmoney(num,l):
    l.acquire()
    for i in range(100):
        num.value -= 1
        time.sleep(0.01)
    l.release()
if __name__ == '__main__':
    l = Lock()
    num = Value('i',100)
    p = Process(target=getmoney,args=(num,l))
    p1 = Process(target=setmoney,args=(num,l))
    #进程p和p1相对于主进程来说是同步执行
    #执行过程中会发生数据错乱
    p.start()
    p1.start()
    #同步主进程
    p.join()
    p1.join()
    print(num.value)

 

2.信号机制

  • semaphore模块:s = semaphore(5)同时控制五把钥匙
  • 可以同时控制多个信号量,然后释放一个,再执行下一个

3.事件机制

Event模块:e = Event():

  • e.set() #将is_set()设置为True
  • e.clear() #将Is_set()设置为False
  • e.wait() #当Is_set()为True时,为非阻塞,反之,为阻塞;

 

e = Event()
print(e.is_set())#默认为False
e.set()     #将is_set设置为True,如果没有这句,遇到阻塞将不往下执行
print(123)
print(e.is_set()) #这为True,wait()才会执行
e.wait()
print(456)
print(e.is_set()) #这也为True


e.clear()#设置为False
print(e.is_set())
e.wait()#执行不了,程序阻塞在此
print(555)

#输出结果
False
123
True
456
True
False

 

posted @ 2018-08-21 17:52  pythonZhou  阅读(217)  评论(0编辑  收藏  举报