并发编程---互斥锁---互斥锁与join的区别

互斥锁

互斥锁就是把多个进程并发,修改成一块共享数据的操作变成串行,保证是一个一个来修改的。

缺点:效率低,加锁过程复杂

优点:增加了安全性

from multiprocessing import Process,Lock
import time

def task(name, mutex):
    mutex.acquire() # 加锁
    print('%s 1' %name)
    time.sleep(1)
    print('%s 2' % name)
    time.sleep(1)
    print('%s 3' % name)
    mutex.release() # 释放锁

if __name__ == '__main__':
    mutex=Lock()
    for i in range(3):
        p = Process(target=task,args=('进程%s' %i,mutex))
        p.start()
'''
打印结果:
进程0 1
进程0 2
进程0 3
进程1 1
进程1 2
进程1 3
进程2 1
进程2 2
进程2 3
'''
互斥锁

模拟抢票

from multiprocessing import Process,Lock
import json
import time

def search(name):
    time.sleep(1) # 模拟网络延迟
    dic = json.load(open('db.txt','r',encoding='utf-8'))
    print('<%s>查看剩余票数 [%s]' %(name, dic['count']))

def get(name):
    time.sleep(1)
    dic = json.load(open('db.txt','r',encoding='utf-8'))
    if dic['count'] > 0:
        dic['count'] -= 1
        time.sleep(3)
        json.dump(dic,open('db.txt','w',encoding='utf-8'))
        print('<%s> 购票成功' %name)

def task(name,mutex):
    search(name)  # 并发的进行
    mutex.acquire()
    get(name)
    mutex.release()

if __name__ == '__main__':
    mutex=Lock()
    for i in range(10):
        p=Process(target=task,args=('路人%s' %i,mutex))
        p.start()
'''
打印结果:
<路人0>查看剩余票数 [1]
<路人4>查看剩余票数 [1]
<路人1>查看剩余票数 [1]
<路人2>查看剩余票数 [1]
<路人5>查看剩余票数 [1]
<路人3>查看剩余票数 [1]
<路人8>查看剩余票数 [1]
<路人6>查看剩余票数 [1]
<路人7>查看剩余票数 [1]
<路人9>查看剩余票数 [1]
<路人0> 购票成功
'''
模拟抢票

互斥锁和join的区别

from multiprocessing import Process,Lock
import json
import time
'''
互斥锁:可以让局部代码串行
join:只能让全部代码变成串行
'''
def search(name):
    time.sleep(1) # 模拟网络延迟
    dic = json.load(open('db.txt','r',encoding='utf-8'))
    print('<%s>查看剩余票数 [%s]' %(name, dic['count']))

def get(name):
    time.sleep(1)
    dic = json.load(open('db.txt','r',encoding='utf-8'))
    if dic['count'] > 0:
        dic['count'] -= 1
        time.sleep(3)
        json.dump(dic,open('db.txt','w',encoding='utf-8'))
        print('<%s> 购票成功' %name)
    else:
        print('<%s> 购票失败' %name)

def task(name,mutex):
    search(name)  # 并发的进行
    mutex.acquire()
    get(name)
    mutex.release()

if __name__ == '__main__':
    mutex=Lock()
    for i in range(3):
        p = Process(target=task,args=('路人%s' %i,mutex))
        p.start()
        p.join()
'''
join打印结果:
<路人0>查看剩余票数 [1]
<路人0> 购票成功
<路人1>查看剩余票数 [0]
<路人1> 购票失败
<路人2>查看剩余票数 [0]
<路人2> 购票失败

互斥锁的打印结果:
<路人1>查看剩余票数 [1]
<路人0>查看剩余票数 [1]
<路人2>查看剩余票数 [1]
<路人1> 购票成功
<路人0> 购票失败
<路人2> 购票失败
'''
posted @ 2018-04-20 23:10  Mr。yang  阅读(290)  评论(0编辑  收藏  举报