首頁技術(shù)文章正文

進(jìn)程、線程、協(xié)程和GIL

更新時(shí)間:2018-12-19 來源:黑馬程序員 瀏覽量:

進(jìn)程

       進(jìn)程就是一個(gè)程序在一個(gè)數(shù)據(jù)集上的一次動(dòng)態(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ā)性,并突破一個(gè)進(jìn)程只能干一樣事的缺陷,使到進(jìn)程內(nèi)并發(fā)成為可能。

       線程也叫輕量級(jí)進(jìn)程,它是一個(gè)基本的CPU執(zhí)行單元,也是程序執(zhí)行過程中的最小單元,由線程ID、程序計(jì)數(shù)器、寄存器集合和堆棧共同組成。線程的引入減小了程序并發(fā)執(zhí)行時(shí)的開銷,提高了操作系統(tǒng)的并發(fā)性能。線程沒有自己的系統(tǒng)資源。

進(jìn)程和線程的關(guān)系

       1. 一個(gè)線程只能屬于一個(gè)進(jìn)程,而一個(gè)進(jìn)程可以有多個(gè)線程,但至少有一個(gè)線程。

       2. 資源分配給進(jìn)程,同一進(jìn)程的所有線程共享該進(jìn)程的所有資源。

       3. CPU分給線程,即真正在CPU上運(yùn)行的是線程。

協(xié)程

       協(xié)程,又稱微線程,協(xié)程是python個(gè)中另外一種實(shí)現(xiàn)多任務(wù)的方式,通俗的理解:在一個(gè)線程中的某個(gè)函數(shù),可以在任何地方保存當(dāng)前函數(shù)的一些臨時(shí)變量等信息,然后切換到另外一個(gè)函數(shù)中執(zhí)行,注意不是通過調(diào)用函數(shù)的方式做到的,并且切換的次數(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é)程是在一個(gè)線程中 所以是并發(fā)

GIL

       1. GIL,全局解釋器鎖(globalinterpreter lock),它是cpython解析器的特性,不是python的特性 ,它要求線程在執(zhí)行前,需要獲取GIL鎖,

       2. 由于GIL的存在,會(huì)影響多線程不能利用多核CPU資源,通過多進(jìn)程+多協(xié)程方式可利用多核CPU資源

       3. 線程釋放GIL鎖的情況:

              (1)在IO操作等可能會(huì)引起阻塞的system call之前,可以暫時(shí)釋放GIL,但在執(zhí)行完畢后,必須重新獲取GIL

              (2)Python3.x使用計(jì)時(shí)器(執(zhí)行時(shí)間達(dá)到閾值后,當(dāng)前線程釋放GIL)

       4. 多線程爬取比單線程性能有提升,因?yàn)橛龅絀O阻塞會(huì)自動(dòng)釋放GIL鎖,這樣在線程阻塞情況下,可以執(zhí)行其他線程中的代碼

       5. 如果對(duì)并行計(jì)算性能較高的程序可以考慮把核心部分寫成C模塊。



作者:傳智播人工智能+Python培訓(xùn)學(xué)院

首發(fā): http://python.itheima.com

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!