現在的計算機的操作系統不管是windows還是linux或者mac都屬於多任務操作系統,比如你可以一般聽歌一邊玩遊戲,或者你打開網站然後聊QQ都是多任務的表現。
進程一般指的是一個程序的執行
線程是指進程內的一個執行單元,也是進程內的可調度實體.
與進程的區別:
(1)地址空間:進程內的一個執行單元;進程至少有一個線程;它們共享進程的地址空間;而進程有自己獨立的地址空間;
(2)資源擁有:進程是資源分配和擁有的單位,同一個進程內的線程共享進程的資源
(3)線程是處理器調度的基本單位,但進程不是.
4)二者均可併發執行.
進程和線程都是由操作系統所體會的程序運行的基本單元,系統利用該基本單元實現系統對應用的併發性。進程和線程的區別在於:
簡而言之,一個程序至少有一個進程,一個進程至少有一個線程.
線程的劃分尺度小於進程,使得多線程程序的併發性高。
另外,進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,從而極大地提高了程序的運行效率。
線程在執行過程中與進程還是有區別的。每個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。但是線程不能夠獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分可以同時執行。但操作系統並沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。
進程是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位.
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源.
一個線程可以創建和撤銷另一個線程;同一個進程中的多個線程之間可以併發執行.
python3提供了很好的進線程管理函數,我們今天就來學習一下進線程在python3裡面的應用:
多進程操作:
這裡我們要引入os模塊
Unix/Linux操作系統提供了一個fork()系統調用,它非常特殊。一般函數調用一次,返回一次,但是fork()調用一次,返回兩次,因為操作系統自動把當前進程(稱為父進程)複製了一份(稱為子進程),然後,分別在父進程和子進程內返回。
子進程永遠返回0,而父進程返回子進程的ID。這樣做的理由是,一個父進程可以fork出很多子進程,所以,父進程要記下每個子進程的ID,而子進程只需要調用getpid()就可以拿到父進程的ID。
import os #先導入os模塊
print('Process (%s) start...' % os.getpid()) #程序一開始就會生成一個主進程
pid = os.fork() #再調用依次fork()函數產生一個子進程
if pid == 0: #如果調用成功則有返回值
print('I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid())) #通過getpid()
else:
print('I (%s) just created a child process (%s).' % (os.getpid(), pid)) #pid是返回的子進程
以上代碼是隻能在linux和Unix和mac操作系統上
windows上是不能用fork()來做進程操作,放心Python是跨平臺的,自然也應該提供一個跨平臺的多進程支持。multiprocessing模塊就是跨平臺版本的多進程模塊。
multiprocessing模塊提供了一個Process類來代表一個進程對象。
from multiprocessing import Process #導入Process函數
import os
def run_proc(name): #Process函數的第一個參數需要需要一個執行函數
print('Run child process %s (%s)...' % (name, os.getpid())) #os.getpid()依然可以取進程id
if __name__=='__main__': #程序啟動確保不是調用啟動
print('Parent process %s.' % os.getpid()) #先用os.getpid()調用主進程
p = Process(target=run_proc, args=('test',)) #Process函數調用,給子進程命名test返回一個實例p
print('Child process will start.')
p.start() # p.start() 開始一個子進程
p.join() # p.join() 關閉一個子進程
print('Child process end.')
在windows裡面記得關閉進程,負責會一直佔用內存
下一節我們再仔細說一下進程進程池線程和管道等。今天的你們學會了嗎,有什麼問題記得給我留言哦