python并发编程之semaphore(信号量)_浅谈Python并发编程之进程(守护进程、锁、信号量)...
前言:本博文是對Python并發編程之進程的知識延伸,主要講解:守護進程、鎖、信號量。
友情鏈接:
一、守護進程(daemon)
1.1 守護進程概念
首先我們都知道:正常情況下,主進程默認等待子進程調用結束之后再結束,守護進程在主進程所有代碼執行完畢之后,自動終止。當然我們也可以使用kill -9 進程號,殺死進程。
那么接下來,我們看一下守護進程的語法:
進程對象.daemon = True
通過上面的代碼,我們就可以設置該進程為守護進程。
注意: 必須要寫在start()方法之前賦值。
此時,將設置為主進程守護,主進程如果代碼執行結束了,該守護進程自動結束。
1.2 守護進程示例
from multiprocessing import Process
import time
def func():
print("子進程start")
time.sleep(1)
print("子進程end")
if __name__ == "__main__":
p = Process(target=func)
p.daemon = True
p.start()
time.sleep(1)
print("主進程執行結束")
因為為守護主進程,主進程結束子進程立即結束。
1.3 多個子進程的情況
當多個子進程并發執行時,默認主進程等待子進程,如果標記該子進程是守護進程,當主進程執行完畢所有代碼之后,守護進程立刻終止。
主進程的代碼執行到最后一行,就意味著函數代碼執行完畢,此時就應該殺掉守護進程。其他非守護進程繼續正常執行,主進程仍然等待直到結束,最后主進程在真正的釋放結束。
from multiprocessing import Process
import time
def func1():
count = 1
while True:
print("*" * count)
time.sleep(0.5)
count +=1
def func2():
print("func2 start")
time.sleep(3)
print("func2 end")
if __name__ == "__main__":
p1 = Process(target=func1)
p1.daemon = True
p1.start()
p2 = Process(target=func2)
p2.start()
print("主進程代碼執行結束...")
二、互斥鎖(Lock)
上鎖:lock.acquire()
解鎖:lock.release()
2.1 互斥鎖概念
同一時間允許一個進程上一把鎖,就是Lock。那么我們加鎖的意義在哪呢?加鎖可以保證多個進程修改同一塊數據時,同一時間只能有一個任務可以進行修改,即串行的修改。雖然我們的程序運行速度是慢了,但犧牲速度卻保證了數據安全。
同一時間允許多個進程上多把鎖 就是[信號量Semaphore]。
信號量是鎖的變形:實際實現是 計數器 + 鎖,同時允許多個進程上鎖。
2.2 互斥鎖作用
互斥鎖Lock:互斥鎖就是進程的相互排斥。
誰先搶到自由,誰就上鎖該資源內容,這樣做可以保證數據的同步性。
注意:多個鎖一起上,不開鎖,會造成死鎖,上鎖和解鎖是一對。
2.3 互斥鎖示例
from multiprocessing import Process, Lock
# 創建一把鎖
lock = Lock()
# 上鎖
lock.acquire()
print(1)
# 解鎖
lock.release()
# 死鎖 : 只上鎖,不解鎖,會阻塞,產生死鎖
lock.acquire()
print(2)
lock.release()
print(3)
lock.acquire()
print(4)
#lock.release():在這里我們不解鎖
lock.acquire()
print(5)
注意:輸出結果沒有5,因為上一個鎖,沒有解鎖,造成了死鎖。
2.4 區分同步和異步
在產生進程對象的時候,進程之間是異步,上鎖之后,進程之間變成同步。
from multiprocessing import Process,Lock
def func(num, lock):
lock.acquire()
print("走到上鎖這個地方,變成一個同步程序,先來的進行先執行,后來的進程后執行,按次序依次執行")
print(num)
lock.release()
if __name__ == "__main__":
# lock互斥鎖, 進程之間數據不共享
# 但是lock對象底層是通過socket來互相發送數據,不管多少進程,都是同一個lock鎖
lock = Lock()
for i in range(3):
p = Process(target=func, args=(i, lock))
# 1. 10個子進程異步執行,是并發操作
p.start()
三、Semaphore(信號量)
信號量Semaphore是一個計數器,控制對公共資源或者臨界區域的訪問量,信號量可以指定同時訪問資源或者進入臨界區域的進程數。每次有一個進程獲得信號量時,計數器-1,若計數器為0時,其他進程就停止訪問信號量,一直阻塞直到其他進程釋放信號量。
我們之前說到的Lock,屬于互斥鎖,也就是一把鑰匙配備一把鎖,同時只允許鎖住某一個數據。而信號量則是多把鑰匙配備多把鎖,也就是說同時允許鎖住多個數據。
from multiprocessing import Process,Semaphore
import random,time
def ktv(person,sem):
# 上鎖
sem.acquire()
print("%s進入ktv唱歌" % (person))
time.sleep(random.randrange(3, 8))
print("%s走出ktv離開" % (person))
# 解鎖
sem.release()
if __name__ == "__main__":
# 同一時間最多允許2個進程執行ktv任務,剩下的進程等待
sem = Semaphore(2)
for i in range(1, 6):
p = Process(target=ktv,args=("person%s" %i, sem))
p.start()
總結
以上是生活随笔為你收集整理的python并发编程之semaphore(信号量)_浅谈Python并发编程之进程(守护进程、锁、信号量)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 代码合并工具_分享几款比较常用的代码比较
- 下一篇: python 界面开发框架_八款常用的