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