第二十六天
阿新 • • 發佈:2021-01-20
今日內容
一、程序
1.1父程序與子程序
什麼是父子程序:當前執行的程式內再運行了另一個程式,那麼後面開啟的程序稱之為當前程序的子程序,當前程序稱之為後面開啟程序的父程序 from multiprocessing import Process import os import time def task(n): print("父程序:%s 自己:%s 正在執行" %(os.getppid(),os.getpid())) time.sleep(3) print("父程序:%s 自己:%s 正在執行" %(os.getppid(),os.getpid())) if __name__ == "__main__": p = Process(target=task,args=(3,)) p.start() print("主",os.getpid())
1.2殭屍程序
什麼是殭屍程序:在每個子程序正常結束後作業系統會回收子程序的重型資源,但會保留一些子程序的資訊,比如pid等,這時的子程序稱之為殭屍程序
解決殭屍程序方式:首先少量的殭屍程序不會影響程式的執行,只有不斷增加而且一直不回收的殭屍程序才會導致程式因為沒有pid號而執行不了
解決方式:基於直譯器的封裝機制,在父程序正常結束執行後會自動檢測產生的殭屍程序並清空回收,所以並不需要自己手動清除
1.3孤兒程序
什麼是孤兒程序:在子程序還在執行時父程序已經結束了,這時的子程序稱之為孤兒程序 孤兒程序釋放的兩種方式: 1、在父程序正常結束後會等子程序執行結束後釋放孤兒程序的資源 2、在殺死父程序時孤兒程序會被pid號為1的init程序接管,init程序會檢測孤兒程序的狀態,當孤兒程序執行完畢後會進行釋放子程序資源
1.4守護程序
守護程序 什麼時守護程序:當父程序結束後無論子程序處在什麼狀態都會跟著一起結束,這時子程序稱之為父程序的守護程序 運用場景:用於父程序結束後子程序的存在已經沒有了意義,所以會一起結束 程式碼演示: from multiprocessing import Process import time import random class Piao(Process): #這時子程序為主程序的守護程序,在主程序結束後子程序內程式碼不會在運行了 def __init__(self,name): self.name=name super().__init__() def run(self): print('%s is piaoing' %self.name) time.sleep(random.randrange(1,3)) print('%s is piao end' %self.name) p=Piao('egon') p.daemon=True #一定要在p.start()前設定,設定p為守護程序,禁止p建立子程序,並且父程序程式碼執行結束,p即終止執行 p.start() print('主')
1.5互斥鎖
什麼是互斥鎖:當多個程序共享同一檔案時,如果都能同時修改的話會造成資料的混亂,所以這時需要控制修改檔案的順序
在程序需要修改檔案時設定一把鎖,當哪個程序搶到這把鎖時才能進行檔案的修改,當程序把這把鎖釋放掉時後面的程序才能開始搶這把鎖,有鎖才能對檔案進行修改
以搶票舉例:
檔案db的內容為:{"count":1}
注意一定要用雙引號,不然json無法識別
#沒有加鎖時,只有一張票,每個使用者都可以搶票成功
from multiprocessing import Process,Lock
import time,json,random
def search():
dic=json.load(open('db.txt'))
print('\033[43m剩餘票數%s\033[0m' %dic['count'])
def get():
dic=json.load(open('db.txt'))
time.sleep(0.1) #模擬讀資料的網路延遲
if dic['count'] >0:
dic['count']-=1
time.sleep(0.2) #模擬寫資料的網路延遲
json.dump(dic,open('db.txt','w'))
print('\033[43m購票成功\033[0m')
def task(lock):
search()
get()
if __name__ == '__main__':
lock=Lock()
for i in range(5): #模擬併發5個客戶端搶票
p=Process(target=task,args=(lock,))
p.start()
#加了鎖時,這時所有使用者都可以看到票的數量,但是隻有搶到了鎖的使用者才能先搶到票
from multiprocessing import Process,Lock
import time,json,random
def search():
dic=json.load(open('db.txt'))
print('\033[43m剩餘票數%s\033[0m' %dic['count'])
def get():
dic=json.load(open('db.txt'))
time.sleep(0.1) #模擬讀資料的網路延遲
if dic['count'] >0:
dic['count']-=1
time.sleep(0.2) #模擬寫資料的網路延遲
json.dump(dic,open('db.txt','w'))
print('\033[43m購票成功\033[0m')
def task(lock):
search()
lock.acquire()
get()
lock.release()
if __name__ == '__main__':
lock=Lock()
for i in range(5): #模擬併發5個客戶端搶票
p=Process(target=task,args=(lock,))
p.start()