全國(guó)咨詢(xún)/投訴熱線(xiàn):400-618-4000

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

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

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

進(jìn)程

       進(jìn)程就是一個(gè)程序在一個(gè)數(shù)據(jù)集上的一次動(dòng)態(tài)執(zhí)行過(guò)程。進(jìn)程一般由程序、數(shù)據(jù)集、進(jìn)程控制塊三部分組成。我們編寫(xiě)的程序用來(lái)描述進(jìn)程要完成哪些功能以及如何完成;數(shù)據(jù)集則是程序在執(zhí)行過(guò)程中所需要使用的資源;進(jìn)程控制塊用來(lái)記錄進(jìn)程的外部特征,描述進(jìn)程的執(zhí)行變化過(guò)程,系統(tǒng)可以利用它來(lái)控制和管理進(jìn)程,它是系統(tǒng)感知進(jìn)程存在的唯一標(biāo)志。

線(xiàn)程

       線(xiàn)程的出現(xiàn)是為了降低上下文切換的消耗,提高系統(tǒng)的并發(fā)性,并突破一個(gè)進(jìn)程只能干一樣事的缺陷,使到進(jìn)程內(nèi)并發(fā)成為可能。

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

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

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

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

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

協(xié)程

       協(xié)程,又稱(chēng)微線(xiàn)程,協(xié)程是python個(gè)中另外一種實(shí)現(xiàn)多任務(wù)的方式,通俗的理解:在一個(gè)線(xiàn)程中的某個(gè)函數(shù),可以在任何地方保存當(dāng)前函數(shù)的一些臨時(shí)變量等信息,然后切換到另外一個(gè)函數(shù)中執(zhí)行,注意不是通過(guò)調(diào)用函數(shù)的方式做到的,并且切換的次數(shù)以及什么時(shí)候再切換到原來(lái)的函數(shù)都由開(kāi)發(fā)者自己確定。

進(jìn)程、線(xiàn)程、協(xié)程關(guān)系

       1. 進(jìn)程是操作系統(tǒng)資源分配的單位

       2. 線(xiàn)程是CPU調(diào)度的單位

       3. 進(jìn)程切換需要的資源最大,效率很低

       4. 線(xiàn)程切換需要的資源一般,效率一般(當(dāng)然在不考慮GIL的情況下)

       5. 協(xié)程切換任務(wù)資源很小,效率高

       6. 多進(jìn)程、多線(xiàn)程根據(jù)cpu核數(shù)不一樣可能是并行的,但是協(xié)程是在一個(gè)線(xiàn)程中 所以是并發(fā)

GIL

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

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

       3. 線(xiàn)程釋放GIL鎖的情況:

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

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

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

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



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

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

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