1、概念
在python中 守護程序也是乙個程序,
預設情況下 主程序即使**執行完畢了 也會等待子程序結束才會結束自己
當乙個程序b設定為另一程序a的守護程序時 a是被守護 b是守護程序
特點是: 當被守護a 結束時,即使b的任務沒有完成也會隨之結束
2、比喻:
康熙 是乙個程序 妃子是康熙的守護程序
康熙駕崩了 如果妃子還活著 那就陪葬去 當然如果妃子的任務提前結束了那就立即掛了
3、案例:
from multiprocessing import process
import time
def task():
print("zi run")
time.sleep(3)
print("zi over")
if __name__ == '__main__':
p = process(target=task)
p.daemon = true # 將這個程序設定為了守護程序 必須在開啟程序前設定
p.start()
print("主over")
1、產生原因
當併發的多個任務,要同時操作同乙個資源,就會造成資料錯亂的問題
2、解決的方法
將併發操作公共資源的** 由併發變為序列 解決安全問題,但是犧牲效率
方法1:序列方式(join):
直接使用join函式
缺點: 將任務中所有**全都序列,此時還是不如不要開程序 ,多個程序之間原本公平競爭 join是強行規定了執行順序
方法2:序列方式(互斥鎖)
其原理就是將要操作公共資源的**鎖起來,以保證同一時間只能有乙個程序在執行這部分**
互斥鎖是什麼
互相排斥的鎖
優點: 可以僅將部分**序列
注意: 必須保證鎖只有一把
使用方式:
from multiprocessing import process,lock
import time,random
def task1(mutex):
# 假設這不是訪問公共資源 那麼還可也併發執行
for i in range(10000):
print(1)
mutex.acquire() # 這是加鎖
time.sleep(random.random())
print("-------name is nick")
time.sleep(random.random())
print("-------gender is girl")
time.sleep(random.random())
print("-------age is 18")
mutex.release() # 解鎖
def task2(mutex):
for i in range(10000):
print(2)
mutex.acquire()
time.sleep(random.random())
print("++++++++name is bgon")
time.sleep(random.random())
print("++++++++gender is oldman")
time.sleep(random.random())
print("++++++++age is 48")
mutex.release()
if __name__ == '__main__':
mutex = lock() # 建立一把互斥鎖
print("建立鎖了!!!!")
p1 = process(target=task1,args=(mutex,))
p2 = process(target=task2,args=(mutex,))
p1.start()
p2.start()
加鎖 解決了安全問題 帶來了效率降低的問題
鎖其實只是給執行**加了限制 本質是乙個標誌 為true 或false
如何使得即保證安全 又提高效率
鎖的 粒度
粒度指的是被鎖住的**的多少
粒度越大鎖住的越多 效率越低
搶票
def show():
with open("db.json") as f:
data = json.load(f)
print("剩餘票數",data["count"])
def buy():
with open("db.json") as f:
data = json.load(f)
if data["count"] > 0:
data["count"] -= 1
with open("db.json","wt") as f2:
json.dump(data,f2)
print("搶票成功!")
def task(mutex):
show()
mutex.acquire()
buy()
mutex.release()
if __name__ == '__main__':
mutex = lock()
for i in range(5):
p = process(target=task,args=(mutex,))
p.start()
守護程序及守護程序輸出
1 建立乙個輸出程式 2 建立乙個守護程序 1 建立乙個輸出程式 守護程序不與終端聯絡,所以,需要另外建立乙個程式用於輸出。也可以直接使用 bin echo example daemon help.cc include int main int argc,char argv else if argc...
守護程序及守護程序輸出
1 建立乙個輸出程式 2 建立乙個守護程序 1 建立乙個輸出程式 守護程序不與終端聯絡,所以,需要另外建立乙個程式用於輸出。也可以直接使用 bin echo example daemon help.cc include int main int argc,char ar else if argc 2...
守護程序分析
守護程序在linux unix系統中有著廣泛的應用。有時,開發人員也想把自己的程式變成守護程序。在建立乙個守護程序的時候,要接觸到子程序 程序組 會晤期 訊號機制 檔案 目錄和控制終端等多個概念。因此守護程序還是比較複雜的,在這裡詳細地討論linux unix的守護程序的編寫,總結出八條經驗,並給出...