python 队列 锁_python-day31(同步锁,队列)
一. 守護進程
守護進程: 主進程的代碼運行結束,守護進程也跟著結束
1 主進程創建守護進程2 其一:守護進程會在主進程代碼執行結束后就終止3 其二: 守護進程內無法才開啟子進程, 否則拋出異常:4 AssertionError: daemonic processes are notallowed to have children5 注意: 進程之間是相互獨立的, 主進程代碼運行結束,守護進程隨機終止
View Code
代碼如下:
from multiprocessing importProcessimporttimedeffun():
time.sleep(2)print('子進程打印不出來')if __name__ == '__main__':
p= Process(target=fun )
p.daemon= True #守護進程
p.start()print('結束')
二. 進程同步
1. 同步鎖(互斥鎖) ***************
保證數據安全用的,但是將鎖起來的那段代碼的執行變成了同步\串行,
犧牲了效率,保證了安全
from multiprocessing import Lock
l = Lock()
l.acquire() #鎖住
數據操作
l.release() #釋放
#由并發變成了串行,犧牲了運行效率,但避免了競爭
from multiprocessing importProcess,Lockimportos,timedefwork(n,lock):#加鎖,保證每次只有一個進程在執行鎖里面的程序,這一段程序對于所有寫上這個鎖的進程,大家都變成了串行
lock.acquire()print('%s: %s is running' %(n,os.getpid()))
time.sleep(1)print('%s:%s is done' %(n,os.getpid()))#解鎖,解鎖之后其他進程才能去執行自己的程序
lock.release()if __name__ == '__main__':
lock=Lock()for i in range(5):
p=Process(target=work,args=(i,lock))
p.start()
2. 信號量
Semaphore 內部維護了一個計數器, acquire-1,release + 1, 當計數器為0的時候
,阻塞其他的進程
1 互斥鎖同時只允許一個線程更改數據,而信號量Semaphore是同時允許一定數量的線程更改數據 。2 假設商場里有4個迷你唱吧,所以同時可以進去4個人,如果來了第五個人就要在外面等待,等到有人出來才能再進去玩。3 實現:4 信號量同步基于內部計數器,每調用一次acquire(),計數器減1;每調用一次release(),計數器加1.當計數器為0時,acquire()調用被阻塞。這是迪科斯徹(Dijkstra)信號量概念P()和V()的Python實現。信號量同步機制適用于訪問像服務器這樣的有限資源。5 信號量與進程池的概念很像,但是要區分開,信號量涉及到加鎖的概念
信號量
1 #semaphre 信號量 鎖 原理跟鎖差不多,但可以限制數量
2 importtime3 from multiprocessing importSemaphore,Process4
5 deffun(n,l):6 l.acquire()7 print('%s開始' %n)8 time.sleep(1)9 print('%s結束>>>' %n)10 time.sleep(1)11 l.release()12 if __name__ == '__main__':13 l = Semaphore(4)14 for i in range(10):15 p = Process(target=fun,args=(i,l))16 p.start()
View Code
3. 事件
e = Even(), 事件初始狀態為False, 當事件為False,e.wait()的地方會阻塞,e.set()
將e 的狀態改為
True,如果e的狀態為True,wait的地方就不等待了,不阻塞了,
e.clear() 將e的狀態改為False,
查看e的狀態: is_set,
1 #Event 事件
2
3 #from multiprocessing import Event
4 # 5 #e = Event() #有兩個狀態 默認TURE wait Fase
6 #print(1)
7 #print(e.is_set()) #查看當前狀態
8 #e.set() #設置狀態為TURE
9 #print(e.is_set())
10 #e.clear() #清空狀態, False
11 #print(e.is_set())
12 #13 #e.wait() #狀態為False 就會被阻塞
14 #print('結束')
三. 進程通信(IPC)
隊列 **************
隊列: 進程安全的,能夠保證數據安全,
Q = queue(4), 給隊列設定一個固定的長度, q.put(),
q.get(),q.get_nowait(),q.get(False),
Q.put() 在隊列滿了的時候會阻塞和q.get在隊列空了之后會阻塞
Q.put_nowait()
Q.full q.empty
#from multiprocessing import Queue#q = Queue(3)#q.put('灰機1號')#q.put('2')#q.put(3)#print(q.empty()) #判斷是否為空#print(q.qsize()) #返回多少個數量#print(q.get())#print(q.get())#print(q.get())## print(q.get()) # q為空時將會被阻塞*******
#print(q.full()) #判斷q已滿#print(q.get_nowait()) ##print(q.get_nowait()) ##print(q.get_nowait()) #
## print(q.get_nowait()) # q為空時報錯 queue.Empty*******#q.get(False) #同上 會報錯
1 #基于隊列的進程通信
2 #from multiprocessing import Process,Queue
3 #def fun(q):
4 #a = q.get()
5 #print('>>>>:', a)
6 #if __name__ == '__main__':
7 #q = Queue(9)
8 #q.put('奧術大師多')
9 #p = Process(target=fun,args=(q,))
10 #p.start()
11 #12 #print('主進程結束')
基于隊列的通信
#Queue#import time#from multiprocessing import Process,Queue#
#def shengchan(q):#for i in range(10):#time.sleep(1)#q.put('包子%s號' %i)#print('包子%s號生產完畢' %i)#q.put(None)#def xiaofei(q):#while 1:#time.sleep(1.5)#a = q.get()#if a == None:#break#print('%s被吃' %a)#
#if __name__ == '__main__':#q = Queue(10)#p1 = Process(target=shengchan,args=(q,))#p2 = Process(target=xiaofei,args=(q,))#p1.start()#p2.start()#print('結束')
生產者消費者模型
生產者消費者模型
緩沖區解耦的事情
Joinablequeue, 能記錄著你往隊列里面put的數據量
其他方法和queue 是一樣的,比queue多了兩個方法: q.task_done,q.join
1 #JoinableQueue
2 #import time
3 #from multiprocessing import Process,JoinableQueue
4 #5 #def shengchan(q):
6 #for i in range(10):
7 #time.sleep(1)
8 #q.put('包子%s號' %i)
9 #print('包子%s號生產完畢' %i)
10 #q.join()
11 #def xiaofei(q):
12 #while 1:
13 #time.sleep(1.5)
14 #a = q.get()
15 #print('%s被 吃' %a)
16 #q.task_done()
17 #18 #if __name__ == '__main__':
19 #q = JoinableQueue(10)
20 #p1 = Process(target=shengchan,args=(q,))
21 #p2 = Process(target=xiaofei,args=(q,))
22 #p2.daemon = True
23 #p1.start()
24 #p2.start()
25 #print('結束')
JoinableQueue隊列應用
總結
以上是生活随笔為你收集整理的python 队列 锁_python-day31(同步锁,队列)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查询条件中含有加号_excel中最全的多
- 下一篇: classes是什么意思怎么读_KY啥意