31 锁,信号量,事件,队列
生活随笔
收集整理的這篇文章主要介紹了
31 锁,信号量,事件,队列
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1.同步鎖(互斥鎖)
from mutilprocessing import Lock
方式一:
lock=Lock()
lock.acquire()
數(shù)據操作的代碼
lock.release()
方式二:
with lock:
數(shù)據操作代碼
2.信號量
from mutilprocessing import Semaphore
一把鎖,多把鑰匙
s=semaphore(n) #同一時間只有n個進程進入鎖里的代碼
s.acquire()
數(shù)據操作代碼
s.release()
3.事件
from mutilprocessing import Event
e=Event() #默認
e.set()
e.clear()
e.wait()
e.is_set()
4.
隊列 Queue 進程間通信 保證數(shù)據安全(同一個數(shù)據只有一個進程能拿到)
先進先出
q=Queue()
q.put()
q.get()
q.full()
q.empty()
q.get_nowait()
q.put_nowait()
Jionablequeue 和隊列類似 多了兩個方法 join() task_done()
守護進程 daemon
隨著父進程結束,守護進程跟著結束
p.daemon=True #必須在p.start 前加
如何將一個子進程設置為守護進程,不能在該子進程中再開子進程
生產者和消費者模型:通過一個第三方(類似緩沖區(qū))進行解耦 from multiprocessing import Process,Lock import timedef show_ticket(i):with open("file","r",encoding="utf-8") as f:num=f.read().strip()print("%s客戶查看到了剩余票數(shù):"%i,num)def func1(i,lock):show_ticket(i)print("準備開始搶票了")time.sleep(1)lock.acquire()with open("file","r",encoding="utf-") as f:num=f.read().strip()if num=="0":print("沒票了")else:with open("file","w",encoding="utf-8") as f:num=int(num)num-=1f.write(str(num))print("%s客戶搶到票了"%i)lock.release()if __name__ == '__main__':lock=Lock()for i in range(10):p=Process(target=func1,args=(i,lock))p.start() 鎖LOCK from multiprocessing import Event,Processe=Event()#兩個狀態(tài) true false 默認為false print("開始了")print(e.is_set()) #查看事件當前的狀態(tài) #False e.set() #將當前事件狀態(tài)改為trueprint(e.is_set())#true e.clear() #將當前事件改為flase e.wait() #事件等待 print(e.is_set()) 事件1 from multiprocessing import Process,Event import time def func1(e):time.sleep(2)print("子進程一大堆運算")e.set() #將事件改為trueif __name__ == '__main__':e=Event()p=Process(target=func1,args=(e,))p.start()print("主進程開始程序")time.sleep(1)print("等待子進程通知")e.wait()print("拿到子進程通知,繼續(xù)執(zhí)行") 事件2Event from multiprocessing import Process,Semaphore import timedef func1(i,s):s.acquire()time.sleep(1)print("%s男嘉賓大保健開始"%i)time.sleep(0.5)print("%s大保健結束"%i)s.release()if __name__ == '__main__':s=Semaphore(3) #信號量和lock類似,多了參數(shù)for i in range(10):p=Process(target=func1,args=(i,s))p.start() 信號量semaphore from multiprocessing import Process,Queuedef func(q):ret=q.get()print(ret)if __name__ == '__main__':q=Queue(5) #隊列是進程安全的q.put("hello gril")p=Process(target=func,args=(q,))p.start()print("主進程結束")def func(q):ret=q.get()print(ret)if __name__ == '__main__':q=Queue(3)q.put("約嗎")p=Process(target=func,args=(q,))p.start()print("主進程結束") 基于隊列進程通信Queue from multiprocessing import Process import os import time class Myprocess(Process):def __init__(self,person):super().__init__()self.person=persondef run(self):print(os.getpid(),self.name)print("%s正在和女主播聊天"%self.person)if __name__ == '__main__':p=Myprocess("劉德華")p.daemon=True #一定要在p.start()之前設置p守護進程,禁止p創(chuàng)建子進程,并且父進程代碼執(zhí)行完畢,p將終止運行 p.start()time.sleep(1)print("主進程結束") 守護進程daemon from multiprocessing import Process,Queue import timedef producer(q):for i in range(10):time.sleep(1)q.put("包子%s號"%i)print("包子%s號生產完畢"%i)q.put(None)def consumer(q):while 1:baozi=q.get()if baozi==None:breaktime.sleep(1.5)print("%s被吃完"%baozi)if __name__ == '__main__':q=Queue(10)p1=Process(target=producer,args=(q,))p2=Process(target=consumer,args=(q,))p1.start()p2.start() 生產者消費者模型 from multiprocessing import Process,JoinableQueueimport time,random,osdef producer(food,q):for i in range(10):time.sleep(random.random())ret="%s%s"%(food,i)q.put(ret)print("%s生產了%s"%(os.getpid(),ret))print("%s生產結束"%food)q.join() #生產完畢,使用此方法進行阻塞 ,直到隊列中所有項目均被處理# print("%s生產結束" % food)def consumer(q):while 1:ret=q.get()time.sleep(random.random())print("%s吃了%s"%(os.getpid(),ret))q.task_done()#向q.join()發(fā)送一次信號,證明一個數(shù)據被取走if __name__ == '__main__':q=JoinableQueue()#生產者們p1=Process(target=producer,args=("包子",q,))p2=Process(target=producer,args=("玉米",q,))p3=Process(target=producer,args=("魚",q,))#消費者們c1=Process(target=consumer,args=(q,))c2=Process(target=consumer,args=(q,))c1.daemon=Truec2.daemon=True#開始p_1=[p1,p2,p3,c1,c2]for p in p_1:p.start()p1.join()p2.join()p3.join() JoinableQueue生產者消費者模型
?
轉載于:https://www.cnblogs.com/knighterrant/p/10038839.html
總結
以上是生活随笔為你收集整理的31 锁,信号量,事件,队列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows下查找mysql配置文件m
- 下一篇: 微信公众平台无法使用支付宝收付款的解决方