進程
進程:
是指正在執行的程序。是程序執行過程中的一次 指令,數據集等的集合。也可以叫做程序的一次執行過程。進程是一個動態的概念。
進程由三大部分組成:代碼段,數據段,PCB:進程管理控制
因為有GIL鎖的存在,在Cpython中,沒有真正的線程並行。但是有真正的多進程並行當你的任務是計算密集的情況下,使用多進程好
總結:在CPython中,IO密集用多線程,計算密集用多進程
進程的三大基本狀態:
- 就緒狀態:已經獲得運行需要的所有資源,除了CPU
- 執行狀態:已經獲得了所有資源包括cpu,處於正在運行
- 阻塞狀態:因為各種原因,進程放棄了cpu,導致進程無法繼續執行,此時進程處於內存中,繼續等待獲取cpu
進程的一個特殊狀態:
- 掛起狀態:是指因為種原因,進程放棄了cpu,導致進程無法繼續執行,此時進程被踢出內存。
並行 : 兩個進程在同一時間點發生
並發 : 兩個進程在同一時間間隔內運行
同步 : 某一個任務的執行必須依賴於另一個任務的返回結果
異步 : 某一個任務的執行,不需要依賴於另一個任務的返回,只需要告訴另一個任務一聲
阻塞 : 程序因為類似於IO等待、等待事件等導致無法繼續執行。
非阻塞:程序遇到類似於IO操作時,不再阻塞等待,如果沒有及時的處理IO,就報錯或者跳過等其他操作
啟動進程的兩種方式
程序並不能單獨運行,只有將程序裝載到內存中,系統為它分配資源才能運行,而這種執行的程序就稱之為進程。程序和進程的區別就在於:程序是指令的集合,它是進程運行的靜態描述文本;進程是程序的一次執行活動,屬於動態概念。
- 進程只能在一個時間干一件事,如果想同時干兩件事或多件事,進程就無能為力了。
- 進程在執行的過程中如果阻塞,例如等待輸入input,整個進程就會掛起,即使進程中有些工作不依賴於輸入的數據,也將無法執行。
第一種方式
import os import time from multiprocessing import Process def func(n): time.sleep(5) print('這里是子進程,子進程的pid是%s,父進程的pid是%s' % (os.getpid(), os.getppid())) if __name__ == '__main__': p = Process(target=func, args=(1,)) # 實例化一個進程對象 p.start() # 開啟一個子進程 print('這里是父進程,父進程的pid是%s,父父的pid是%s' % (os.getpid(), os.getppid()))
結果
這里是父進程,父進程的pid是3620,父父的pid是2762
這里是子進程,子進程的pid是3621,父進程的pid是3620
os.getpid()獲取的是當前進程自己的pid
os.getppid()獲取的是當前進程的父進程的pid
第二種方式,繼承的方式
from multiprocessing import Process class MyProcess(Process): def __init__(self): super(MyProcess, self).__init__() def run(self): print('這是以繼承類的方式開啟的子進程') if __name__ == '__main__': p1 = MyProcess() p1.start() # 是指,解釋器告訴操作系統,去幫我開啟一個進程,就緒狀態,方法必須為run # p1.run()# 告訴操作系統,現在馬上幫我執行這個子進程 執行
結果:
這是以繼承類的方式開啟的子進程
import multiprocessing, time def run(n): time.sleep(2) print('%s in the run...' % n) if __name__ == '__main__': for i in range(5): m = multiprocessing.Process(target=run,args=(i,)) m.start()
結果
0 in the run... 1 in the run... 2 in the run... 3 in the run... 4 in the run...
2秒后一起執行的
