更新時間:2018-12-19 來源:黑馬程序員 瀏覽量:
進(jìn)程
進(jìn)程就是一個程序在一個數(shù)據(jù)集上的一次動態(tài)執(zhí)行過程。進(jìn)程一般由程序、數(shù)據(jù)集、進(jìn)程控制塊三部分組成。我們編寫的程序用來描述進(jìn)程要完成哪些功能以及如何完成;數(shù)據(jù)集則是程序在執(zhí)行過程中所需要使用的資源;進(jìn)程控制塊用來記錄進(jìn)程的外部特征,描述進(jìn)程的執(zhí)行變化過程,系統(tǒng)可以利用它來控制和管理進(jìn)程,它是系統(tǒng)感知進(jìn)程存在的唯一標(biāo)志。
線程
線程的出現(xiàn)是為了降低上下文切換的消耗,提高系統(tǒng)的并發(fā)性,并突破一個進(jìn)程只能干一樣事的缺陷,使到進(jìn)程內(nèi)并發(fā)成為可能。
線程也叫輕量級進(jìn)程,它是一個基本的CPU執(zhí)行單元,也是程序執(zhí)行過程中的最小單元,由線程ID、程序計數(shù)器、寄存器集合和堆棧共同組成。線程的引入減小了程序并發(fā)執(zhí)行時的開銷,提高了操作系統(tǒng)的并發(fā)性能。線程沒有自己的系統(tǒng)資源。
進(jìn)程和線程的關(guān)系
1. 一個線程只能屬于一個進(jìn)程,而一個進(jìn)程可以有多個線程,但至少有一個線程。
2. 資源分配給進(jìn)程,同一進(jìn)程的所有線程共享該進(jìn)程的所有資源。
3. CPU分給線程,即真正在CPU上運(yùn)行的是線程。
協(xié)程
協(xié)程,又稱微線程,協(xié)程是python個中另外一種實(shí)現(xiàn)多任務(wù)的方式,通俗的理解:在一個線程中的某個函數(shù),可以在任何地方保存當(dāng)前函數(shù)的一些臨時變量等信息,然后切換到另外一個函數(shù)中執(zhí)行,注意不是通過調(diào)用函數(shù)的方式做到的,并且切換的次數(shù)以及什么時候再切換到原來的函數(shù)都由開發(fā)者自己確定。
進(jìn)程、線程、協(xié)程關(guān)系
1. 進(jìn)程是操作系統(tǒng)資源分配的單位
2. 線程是CPU調(diào)度的單位
3. 進(jìn)程切換需要的資源最大,效率很低
4. 線程切換需要的資源一般,效率一般(當(dāng)然在不考慮GIL的情況下)
5. 協(xié)程切換任務(wù)資源很小,效率高
6. 多進(jìn)程、多線程根據(jù)cpu核數(shù)不一樣可能是并行的,但是協(xié)程是在一個線程中 所以是并發(fā)
GIL
1. GIL,全局解釋器鎖(globalinterpreter lock),它是cpython解析器的特性,不是python的特性 ,它要求線程在執(zhí)行前,需要獲取GIL鎖,
2. 由于GIL的存在,會影響多線程不能利用多核CPU資源,通過多進(jìn)程+多協(xié)程方式可利用多核CPU資源
3. 線程釋放GIL鎖的情況:
(1)在IO操作等可能會引起阻塞的system call之前,可以暫時釋放GIL,但在執(zhí)行完畢后,必須重新獲取GIL
(2)Python3.x使用計時器(執(zhí)行時間達(dá)到閾值后,當(dāng)前線程釋放GIL)
4. 多線程爬取比單線程性能有提升,因?yàn)橛龅絀O阻塞會自動釋放GIL鎖,這樣在線程阻塞情況下,可以執(zhí)行其他線程中的代碼
5. 如果對并行計算性能較高的程序可以考慮把核心部分寫成C模塊。
作者:傳智播人工智能+Python培訓(xùn)學(xué)院
首發(fā): http://python.itheima.com