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設置為主進程的守護進程,主進程結束,無論子進程是否正常執行完,都跟主進程一起結束?
二、互斥鎖
?互斥鎖:
強調:必須是lock.acquire()一次,然后 lock.release()釋放一次,才能繼續lock.acquire(),不能連續的lock.acquire()
?互斥鎖vs join的區別:
? ? 大前提:
?二者的原理都是一樣,都是將并發變成串行,從而保證有序
?
??區別:
?一、join是按照人為指定的順序執行,而互斥鎖是所以進程平等地競爭,誰先搶到誰執行
?二、 互斥鎖可以讓一部分代碼(修改共享數據的代碼)串行,而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() 模擬搶票系統
?
?
三、IPC通信(進程之間的的通信控制)
進程之間通信必須找到一種介質,該介質必須滿足
- 是所有進程共享的
- 必須是內存空間
- 附加:幫我們自動處理好鎖的問題
1、隊列(推薦使用)? ? ?
- 共享的空間
- 是內存空間
- 自動幫我們處理好鎖定問題
? 強調:
? ? ?1、隊列用來存成進程之間溝通的消息,數據量不應該過大
? ? ?2、maxsize的值超過的內存限制就變得毫無意義
?
p.put('first',block=False,timeout=4) p.get('first',block=False,timeout=4)#第一個參數 是存放到隊列中的數據 #第二個參數block ,是否進入阻塞狀態,當隊滿存值或隊空取值時,默認值為True #第三個參數timeout ,當隊滿存值或隊空取值時,阻塞等待的時間,若超過時間則報錯?
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() #創建一個共享空間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、管道(不推薦使用)
- 是所有進程共享的
- 是內存空間
- 兩頭存取數據
- 沒有幫我們自動處理好鎖的問題
?
四、生產者消費者模型
該模型中包含兩類重要的角色:
1、生產者:將負責造數據的任務比喻為生產者
2、消費者:接收生產者造出的數據來做進一步的處理,該類人物被比喻成消費者
實現生產者消費者模型三要素
1、生產者
2、消費者
3、隊列
什么時候用該模型:
程序中出現明顯的兩類任何,一類任務是負責生產,另外一類任務是負責處理生產的數據的
該模型的好處:
1、實現了生產者與消費者解耦和
2、平衡了生產力與消費力,即生產者可以一直不停地生產,消費者可以不停地處理,因為二者
不再直接溝通的,而是跟隊列溝通
?
轉載于:https://www.cnblogs.com/95lyj/p/8945183.html
總結
以上是生活随笔為你收集整理的4月25日 python学习总结 互斥锁 IPC通信 和 生产者消费者模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 泰康人寿转保是什么意思 达到这些条件可转
- 下一篇: websocket python爬虫_p