日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

4月25日 python学习总结 互斥锁 IPC通信 和 生产者消费者模型

發布時間:2024/10/12 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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,random 3 4 mutex=Lock() 5 # 互斥鎖: 6 #強調:必須是lock.acquire()一次,然后 lock.release()釋放一次,才能繼續lock.acquire(),不能連續的lock.acquire() 7 8 # 互斥鎖vs join的區別一: 9 # 大前提:二者的原理都是一樣,都是將并發變成串行,從而保證有序 10 # 區別:# 互斥鎖vs join的區別: 11 # 大前提:二者的原理都是一樣,都是將并發變成串行,從而保證有序 12 # 區別:一、join是按照人為指定的順序執行,而互斥鎖是所以進程平等地競爭,誰先搶到誰執行 13 # 二、 互斥鎖可以讓一部分代碼(修改共享數據的代碼)串行,而join只能將代碼整體串行 14 15 def task1(lock): 16 lock.acquire() #搶鎖 17 print('task1:名字是egon') 18 time.sleep(random.randint(1,3)) 19 print('task1:性別是male') 20 time.sleep(random.randint(1,3)) 21 print('task1:年齡是18') 22 lock.release() #釋放鎖 23 24 def task2(lock): 25 lock.acquire() 26 print('task2:名字是alex') 27 time.sleep(random.randint(1,3)) 28 print('task2:性別是male') 29 time.sleep(random.randint(1,3)) 30 print('task2:年齡是78') 31 lock.release() 32 33 34 def task3(lock): 35 lock.acquire() 36 print('task3:名字是lxx') 37 time.sleep(random.randint(1,3)) 38 print('task3:性別是female') 39 time.sleep(random.randint(1,3)) 40 print('task3:年齡是30') 41 lock.release() 42 43 44 45 if __name__ == '__main__': 46 p1=Process(target=task1,args=(mutex,)) 47 p2=Process(target=task2,args=(mutex,)) 48 p3=Process(target=task3,args=(mutex,)) 49 50 # p1.start() 51 # p1.join() 52 # p2.start() 53 # p2.join() 54 # p3.start() 55 # p3.join() 56 57 p1.start() 58 p2.start() 59 p3.start() 互斥鎖應用

 

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的值超過的內存限制就變得毫無意義

from multiprocessing import Queueq=Queue(3) #創建隊列,并為隊列設置大小 此處為3 q.put('first') q.put({'second':None}) #可以存放任意類型 q.put('')# q.put(4) #隊列存滿,第四個存不進,阻塞,等待別的進程取出隊列中內容print(q.get()) print(q.get()) print(q.get()) print(q.get()) # 阻塞 ,隊列為空,取不出東西,等待其他進程往隊列中存放東西

?

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、平衡了生產力與消費力,即生產者可以一直不停地生產,消費者可以不停地處理,因為二者
不再直接溝通的,而是跟隊列溝通

1 import time 2 import random 3 from multiprocessing import Process,Queue 4 5 def consumer(name,q): 6 while True: 7 res=q.get() 8 time.sleep(random.randint(1,3)) 9 print('\033[46m消費者===》%s 吃了 %s\033[0m' %(name,res)) 10 11 12 def producer(name,q,food): 13 for i in range(5): 14 time.sleep(random.randint(1,2)) 15 res='%s%s' %(food,i) 16 q.put(res) 17 print('\033[45m生產者者===》%s 生產了 %s\033[0m' %(name,res)) 18 19 20 if __name__ == '__main__': 21 #1、共享的盆 22 q=Queue() 23 24 #2、生產者們 25 p1=Process(target=producer,args=('egon',q,'包子')) 26 p2=Process(target=producer,args=('劉清政',q,'泔水')) 27 p3=Process(target=producer,args=('楊軍',q,'米飯')) 28 29 #3、消費者們 30 c1=Process(target=consumer,args=('alex',q)) 31 c2=Process(target=consumer,args=('梁書東',q)) 32 33 34 p1.start() 35 p2.start() 36 p3.start() 37 c1.start() 38 c2.start() 生產者消費者模式

?

轉載于:https://www.cnblogs.com/95lyj/p/8945183.html

總結

以上是生活随笔為你收集整理的4月25日 python学习总结 互斥锁 IPC通信 和 生产者消费者模型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。