1. 程式人生 > 實用技巧 >第二十六天

第二十六天

今日內容

一、程序

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()