守護程序及程序資料安全問題分析

2022-08-28 13:09:17 字數 2775 閱讀 1617

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的守護程序的編寫,總結出八條經驗,並給出...