4月25日 python学习总结 互斥锁 IPC通信 和 生产者消费者模型
一、守護進程
import random import time from multiprocessing import Processdef task():print('name: egon')time.sleep(random.randint(0,3))print('sex:male')time.sleep(random.randint(0, 3))print('age:19')if __name__ == '__main__':p=Process(target=task)p.daemon() #將p設(shè)置為主進程的守護進程,主進程結(jié)束,無論子進程是否正常執(zhí)行完,都跟主進程一起結(jié)束?
二、互斥鎖
?互斥鎖:
強調(diào):必須是lock.acquire()一次,然后 lock.release()釋放一次,才能繼續(xù)lock.acquire(),不能連續(xù)的lock.acquire()
?互斥鎖vs join的區(qū)別:
? ? 大前提:
?二者的原理都是一樣,都是將并發(fā)變成串行,從而保證有序
?
??區(qū)別:
?一、join是按照人為指定的順序執(zhí)行,而互斥鎖是所以進程平等地競爭,誰先搶到誰執(zhí)行
?二、 互斥鎖可以讓一部分代碼(修改共享數(shù)據(jù)的代碼)串行,而join只能將代碼整體串行
1 from multiprocessing import Process,Lock 2 import time,json,random,os 3 4 lock=Lock() 5 def search(): 6 print('========%s 查票======' % os.getpid()) 7 info=json.load(open('test.txt')) 8 msg='余票為: %s'%info['count'] 9 print(msg) 10 11 def get(lock): 12 lock.acquire() 13 print('========%s 搶票======'%os.getpid()) 14 info = json.load(open('test.txt')) 15 time.sleep(random.random()) 16 if info['count']>0: 17 info['count']-=1 18 time.sleep(random.random()) 19 json.dump(info,open('test.txt','w')) 20 print('搶票成功') 21 else: 22 print('票已售完') 23 lock.release() 24 25 def op(lock): 26 search() 27 get(lock) 28 29 if __name__ == '__main__': 30 for i in range(0,50): 31 p=Process(target=op,args=(lock,)) 32 p.start() 模擬搶票系統(tǒng)
?
?
三、IPC通信(進程之間的的通信控制)
進程之間通信必須找到一種介質(zhì),該介質(zhì)必須滿足
- 是所有進程共享的
- 必須是內(nèi)存空間
- 附加:幫我們自動處理好鎖的問題
1、隊列(推薦使用)? ? ?
- 共享的空間
- 是內(nèi)存空間
- 自動幫我們處理好鎖定問題
? 強調(diào):
? ? ?1、隊列用來存成進程之間溝通的消息,數(shù)據(jù)量不應(yīng)該過大
? ? ?2、maxsize的值超過的內(nèi)存限制就變得毫無意義
?
p.put('first',block=False,timeout=4) p.get('first',block=False,timeout=4)#第一個參數(shù) 是存放到隊列中的數(shù)據(jù) #第二個參數(shù)block ,是否進入阻塞狀態(tài),當(dāng)隊滿存值或隊空取值時,默認值為True #第三個參數(shù)timeout ,當(dāng)隊滿存值或隊空取值時,阻塞等待的時間,若超過時間則報錯?
2、Manager
沒有處理好鎖問題,不推薦使用
from multiprocessing import Process,Manager,Lock import timemutex=Lock()def task(dic,lock):lock.acquire()temp=dic['num']time.sleep(0.1)dic['num']=temp-1lock.release()if __name__ == '__main__':m=Manager() #創(chuàng)建一個共享空間dic=m.dict({'num':10})l=[]for i in range(10):p=Process(target=task,args=(dic,mutex))l.append(p)p.start()for p in l:p.join()print(dic)
3、管道(不推薦使用)
- 是所有進程共享的
- 是內(nèi)存空間
- 兩頭存取數(shù)據(jù)
- 沒有幫我們自動處理好鎖的問題
?
四、生產(chǎn)者消費者模型
該模型中包含兩類重要的角色:
1、生產(chǎn)者:將負責(zé)造數(shù)據(jù)的任務(wù)比喻為生產(chǎn)者
2、消費者:接收生產(chǎn)者造出的數(shù)據(jù)來做進一步的處理,該類人物被比喻成消費者
實現(xiàn)生產(chǎn)者消費者模型三要素
1、生產(chǎn)者
2、消費者
3、隊列
什么時候用該模型:
程序中出現(xiàn)明顯的兩類任何,一類任務(wù)是負責(zé)生產(chǎn),另外一類任務(wù)是負責(zé)處理生產(chǎn)的數(shù)據(jù)的
該模型的好處:
1、實現(xiàn)了生產(chǎn)者與消費者解耦和
2、平衡了生產(chǎn)力與消費力,即生產(chǎn)者可以一直不停地生產(chǎn),消費者可以不停地處理,因為二者
不再直接溝通的,而是跟隊列溝通
?
轉(zhuǎn)載于:https://www.cnblogs.com/95lyj/p/8945183.html
總結(jié)
以上是生活随笔為你收集整理的4月25日 python学习总结 互斥锁 IPC通信 和 生产者消费者模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 泰康人寿转保是什么意思 达到这些条件可转
- 下一篇: StringGrid数据导出到Excel