1. 程式人生 > >python中程序相關知識點。很強大

python中程序相關知識點。很強大

程序
# 單核CPU實現多工:時間片輪轉 -------------------------------------------------------------------------------------- 重點(程序池,process類,Queue) 作業:如何利用fork建立三個程序. --------------------------------------------------------------------------------------
一 linux系統下利用fork建立程序:

# fork在父子程序分別完成不同任務的方法。(根據返回值的不一樣,利用if,else完成不同任務) # 程序中的變數全部獨立
1程序是一個具體的應用程式,執行緒是程序中的一個分支,為單獨完成程式中的某一項或一組功能而存在。 應用程式可以有一個或多個程序,一個程序可以有一個或多個執行緒,其中一個是主執行緒(執行緒是程序中的實體,一個執行緒必須有一個父程序)。
2程序的執行順序是由作業系統的排程演算法決定的。造成排程的程序和子程序的順序是不一樣的。
3fork是通過複製的方式獲得子程序。

4作業系統儲存程序之間彼此是隔離的,不能通過通過全域性變數讓程序直接傳遞資料。
二multiprocessing import Process: #直接利用process建立程序,傳遞任務函式,啟動程序 #繼承process類建立程序,重寫run()啟動程序呼叫的是start函式。
  1. Process建立的是子程序物件
  2. p.name,   p.pid,  p.is_alive()
  3. p.start(),  p.join(),  p.terminate()
  4. p.join()讓父程序等待響應的子程序結束,並且回收資源。
  5. p.join()讓父程序等待的狀態稱為阻塞
  6. P = Process(target = 函式名,name ='重新命名',args=(),kwargs={})
  7. process裡面的name是給程序物件進行重新命名
  8. 用Process繼承類,繼承類的名字就是物件.name的名字
  9. 用Process繼承類用的更多。繼承類用run()方法,引數在繼承類的__init__方法內傳參
  10. run()方法實現的是程序物件具體的功能
  11. 判斷p.is_alive()存活 的條件,在p.start()之後,在p.join()之前。


三程序池:批量建立程序的集合,當任務完成後,程序回到程序池,等待下次任務,複用程序。
  1. 非同步新增任務是一次性向程序池新增任務。(程序池建立之後,如果不關閉程序池,父程序結束之後,程式就結束。所以需要程序池)。 

     19.   同步新增任務是任務按順序新增,任務完成後新增下一個任務。(同步新增可以不用關閉程序池)。

  1. 程序池預設程序個數跟當前主機CPU的核數相關。print(os.cpu_count())#獲得當前主機CPU的核數。
  2. p = Pool(3)   #設定程序池裡面的程序數
  3. p.apply #阻塞式執行,就是任務挨個執行,任務執行完畢在進行下一個任務執行
  4. p.apply_async  #非阻塞式執行,批量處理任務,不等每個程式執行完畢執行。
  5. p.apply_async(func#定義p呼叫的函式功能,(i,)#傳入的引數元祖))
  6. p.close() #非同步新增任務即apply_async一定要close,原因是主程序執行結束會直接結束其他程序。#同步新增任務即apply不需要關閉close.
  7. p.terminate()#不管任務是否結束,立即終止任務。

四,queue佇列 #實現程序中的通訊
  1. q = Queue(3) # 初始化一個Queue物件,能夠接受三條put訊息:q.put('訊息1'),q.put('訊息2').....
  2. q.get(mst)用來取得資料q.get('訊息')。。q.put('4',timeout=3)等待3秒阻塞。。
  3. 當佇列滿的時候,put可能會阻塞。q.put('4',block=flase)
  4. 如果訊息數量大於需要接受的值,使用try,except來接受。
  5. 顯示當前佇列訊息數量,使用q.qsize(); 判斷都列是否為空,Queue.empty(),為空返回True,反之flase; Queue.full(),佇列是否滿了,滿了返回True,反之flase
  6. q.get_nowait()等價於q.put('4',block=flase)
  7. 當佇列為空,get可能會阻塞。q.get(block=flase)關閉阻塞。
  8. 程序池中如果要用Queue要通過Manager().Queue()
  9. 原理:在記憶體中開一段公共的緩衝區

五,殭屍程序 
  1. 子程序結束,資源沒有回收稱為殭屍程序。
  2. 父程序產生子程序,子程序結束,父程序正在進行,並且沒有回收子程序資源。-殭屍程序
  3. os.wait() #讓父程序等待子程序結束,並回收殭屍程序資源。意味著父程序要等待子程序程式碼先結束。
  4. 父程序產生子程序,父程序先結束,子程序在執行,稱為孤兒程序。父程序pid被回收,被一個特定的程序收養。孤兒程序屬於後臺程序的一種,不會阻塞前臺程序的輸出。
  5. process建立的子程序,在建立的時候就關閉了鍵盤輸入流。不可以從鍵盤讀入內容。
  6. fork,process都會產生殭屍程序。回收殭屍程序的語句是:process的join,fork的wait。