進(jìn)程
每個獨(dú)立執(zhí)行的程序成為進(jìn)程
進(jìn)程是程序的一次動態(tài)執(zhí)行過程,它經(jīng)歷了從代碼加載、執(zhí)行到執(zhí)行完畢的一個完整過程,這個過程也是進(jìn)程本身從產(chǎn)生、發(fā)展到最終消亡的一個過程。
多進(jìn)程(多任務(wù))操作系統(tǒng)能同時運(yùn)行多個(程序),由于CPU具有備份時機(jī)制,所以每個進(jìn)程都能獲得自己CPU時間片,由于CPU執(zhí)行速度非??欤沟盟谐绦蚝孟裨凇巴瑫r”運(yùn)行一樣。
在操作系統(tǒng)中進(jìn)程是進(jìn)行系統(tǒng)資源分配、調(diào)度和管理的最小單位,進(jìn)程在執(zhí)行過程中擁有更獨(dú)立的內(nèi)存單元。
比如:Windows采用進(jìn)程作為最小隔離單位,每個進(jìn)程都有自己的數(shù)據(jù)段、代碼段,并且與別人的進(jìn)程沒有任何關(guān)系,因此進(jìn)程間進(jìn)行信息交互比較麻煩
進(jìn)程也可以通過派生(fork或者spawn)新的進(jìn)程來執(zhí)行其他任務(wù),不過因?yàn)槊總€新進(jìn)程也都擁有自己的內(nèi)存和數(shù)據(jù)棧等,所以只能采用進(jìn)程間通信(IPC)的方式共享信息
線程
為了解決進(jìn)程調(diào)度資源的浪費(fèi),為了能夠共享資源,出現(xiàn)了線程,有時候把線程稱之為輕量級進(jìn)程。
線程是CPU調(diào)度和分派的基本單位,他可與同屬一個進(jìn)程的其他線程共享進(jìn)程所擁有的全部資源,多個線程共享內(nèi)存,從而極大的提高了程序的運(yùn)行效率。
線程是比進(jìn)程更小的執(zhí)行單位,線程是進(jìn)程內(nèi)部單一的一個順序控制流。
所謂多線程是指一個進(jìn)程在執(zhí)行過程中可以產(chǎn)生多個線程,這些線程可以同時存在,同時運(yùn)行,形成多條執(zhí)行線索,一個進(jìn)程可能包含了多個同時執(zhí)行的線程。
一個或更多的線程構(gòu)成一個進(jìn)程(操作系統(tǒng)是一進(jìn)程為單位的,而進(jìn)程是一線程為單位的,進(jìn)程中必須有一個主線程main)
如果一個進(jìn)程沒有了,那么這個進(jìn)程內(nèi)的所有線程肯定會消失,如果線程消失了,但是進(jìn)程未必會消失,只有所有的線程都結(jié)束了,今后才能才會結(jié)束,而且所有的線程都是在進(jìn)程的基礎(chǔ)之上同時運(yùn)行的。
在大多數(shù)系統(tǒng)上,python支持多進(jìn)程(基于消息傳遞)編程和多線程編程,大多人比較熟悉的事多線程編程,但是在python中的多線程編程卻是有諸多的限制。
python中的多線程的限制
為了線程安全考慮,python的解釋器還是使用了內(nèi)部的GIL(Global Interperter Lock,全局解釋器鎖定),在任意時刻只能運(yùn)行單個python的線程執(zhí)行。
即使有多個可用的cpu核心,也是如此,這就限制了python只能在一個cpu核心上運(yùn)行。
GIL的存在直接影響了程序的并發(fā)編程問題
如果一個應(yīng)用程序是大部分與I/O相關(guān),那么使用線程一般沒問題,因?yàn)榇蟛糠謺r間都是在I/O等待
如果一個應(yīng)用程序是CPU密集型的,則使用多線程壞處大于好處,返回會降低程序的運(yùn)行速度,一般比你想象的還要慢得多
因此,用戶在有些情況需要使用多進(jìn)程(多進(jìn)程和消息傳遞)