併發編程-進~線程-02互斥鎖

併發編程更加充分的利用IO資源,可是也帶來了新的問題:當多個進程使用同一份數據資源的時候,就會引起數據安全或順序混亂問題。python

1、多進程搶佔輸出資源

import os
import time
import random
from multiprocessing import Process

def work(n):
    print('%s: %s is running' %(n,os.getpid()))
    time.sleep(random.random())
    print('%s:%s is done' %(n,os.getpid()))

if __name__ == '__main__':
    for i in range(3):
        p=Process(target=work,args=(i,))
        p.start()

2、使用鎖維護執行順序

由併發變成了串行,犧牲了運行效率,但避免了競爭

import os
import time
import random
from multiprocessing import Process,Lock

def work(lock,n):
    lock.acquire()
    print('%s: %s is running' % (n, os.getpid()))
    time.sleep(random.random())
    print('%s: %s is done' % (n, os.getpid()))
    lock.release()
if __name__ == '__main__':
    lock=Lock()
    for i in range(3):
        p=Process(target=work,args=(lock,i))
        p.start()

上面這種狀況雖然使用加鎖的形式實現了順序的執行,可是程序又從新變成串行了,這樣確實會浪費了時間,卻保證了數據的安全。編程

三丶進程的互斥鎖的實戰應用

from multiprocessing import Process,Lock
import time
import json

# 查票
def search(i):
    with open('data','r',encoding='utf-8') as f:
        data = f.read()
    t_d = json.loads(data)
    print('用戶%s查詢餘票爲:%s'%(i,t_d.get('ticket')))

# 買票
def buy(i):
    with open('data','r',encoding='utf-8') as f:
        data = f.read()
    t_d = json.loads(data)
    time.sleep(1)
    if t_d.get('ticket') > 0:
        # 票數減一
        t_d['ticket'] -= 1
        # 更新票數
        with open('data','w',encoding='utf-8') as f:
            json.dump(t_d,f)
        print('用戶%s搶票成功'%i)
    else:
        print('沒票了')

def run(i,mutex):
    search(i)
    mutex.acquire()  # 搶鎖  只要有人搶到了鎖 其餘人必須等待該人釋放鎖
    buy(i)
    mutex.release()  # 釋放鎖

if __name__ == '__main__':
    mutex = Lock()  # 生成了一把鎖
    for i in range(10):
        p = Process(target=run,args=(i,mutex))
        p.start()
相關文章
相關標籤/搜索