什麼是進程:python
一個正在被運行的程序就稱之爲進程,是程序具體執行的過程,是一種抽象概念,進程來自操做系統linux
2.多進程程序員
多個正在運行的程序windows
在python中實現多線程的方法瀏覽器
from multiprocessing import Process import os import time # 當出現一些耗時時間比較長的操做時,會致使程序進入阻塞狀態,沒法執行其餘代碼 # 這個時候就能夠開啓子進程把任務交給他 def task(name): print('name%s子進程開始!'% name) print('name%s子進程結束!'% name) if __name__ == '__main__': p = Process(target=task,args=('大哥',)) # 開啓子進程,本質是向操做系統發送請求,讓它啓動進程,一般不可能當即開啓 p.start() p.join() print('父進程結束') ''' PS:windows 和 linux 開啓進程的方式不一樣 相同之處:都是須要將數據copy一份給子進程,這樣 子進程才知道要幹什麼 linux 會將父進程的全部數據 徹底copy,而後拿到父進程,知道代碼的位置,繼續執行 windows 會copy 一部分數據 同時會導入py文件來執行,這樣一來就會遞歸開啓進程 因此windows中開啓子進程都須要開啓判斷 不過都建議加上判斷,能夠保證兩個平臺均可以使用 記住: 開啓進程的代碼,都把它放到 if __name__ == '__main__': 中便可 '''
自定義開啓子進程:多線程
程序就是一堆計算機能夠識別文件,程序在沒有被運行就是躺在硬盤上的一堆二進制併發
運行程序時,要從硬盤讀取數據到內存中,CPU從內存讀取指令並執行 ,函數
一旦運行就產生了進程 優化
一個程序能夠屢次執行 產生多個進程,可是進程之間相互獨立spa
當咱們右鍵運行了一個py文件時 ,其實啓動的是python解釋器,你的py文件實際上是看成參數傳給瞭解釋器
1. 阻塞與非阻塞
阻塞:當程序遇到IO操做(輸入輸出)時,就進入了阻塞狀態
非阻塞:程序正常運行種,沒有遇到任何IO操做,就處於非阻塞狀態
阻塞與非阻塞說的是程序運行狀態
2.併發
同一時間段,有多個程序都處於運行狀態,但一個時間點只有一個程序被CUP處理,本質上切換執行,切換的同時,保存上一個任務的操做
3.並行
同一時間段,多個任務同時被CUP處理
併發與並行說的是任務的處理方式
PS:關於程序員永恆的話題
提升效率
根本方法就是讓程序儘量處於運行狀態
減小IO 儘量多佔用CPU時間
# Process其餘使用方法
from multiprocessing import Process def task(): print('121212') exit(100) # 退出碼 if __name__ == '__main__': p = Process(target=task,name='李果') p.start() # 此處名爲懶加載優化機制,若是沒有調用start ,那麼該對象將不會被建立 p.join() # 等待子進程結束 p.terminate() # 終止進程 print(p.is_alive()) # 判斷進程是否存活 print(p.pid) # 查看PID print(p.exitcode) # 獲取退出碼
import time from multiprocessing import Process def stak(i): print('買菸去了') time.sleep(i) print('%s 買完了!'% i) if __name__ == '__main__': strat_time = time.time() p1 = Process(target=stak,args=(1,)) p2 = Process(target=stak,args=(2,)) p3 = Process(target=stak,args=(3,)) # strat() 是同時進行的 p1.start() p2.start() p3.start() # join等待的順序是根據子進程工做結束的順序來定的 p1.join() p2.join() p3.join() end_time = time.time() print(end_time - strat_time) print('over')
孤兒進程:
指的是,父進程先結束 ,而子進程還在運行着,
孤兒進程無害,有 其存在的必要性
例如:qq開啓了瀏覽器,qq先退出了 瀏覽器應該繼續運行
孤兒進程會被操做系統接管
殭屍進程:
值得是,子進程已經結束了,可是操做系統會保存一些進程信息,如PID,運行時間等,此時這個進程就稱之爲殭屍進程
殭屍進程若是太多將會佔用大量的資源,形成系統沒法開啓新新進程
linux 中有一個wai/waitpid 用於父進程回收子進程資源