小編給大家分享一下python中GIL的原理分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)長(zhǎng)期為上1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為欽州企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、成都做網(wǎng)站,欽州網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
Python是一種跨平臺(tái)的、具有解釋性、編譯性、互動(dòng)性和面向?qū)ο蟮哪_本語言,其最初的設(shè)計(jì)是用于編寫自動(dòng)化腳本,隨著版本的不斷更新和新功能的添加,常用于用于開發(fā)獨(dú)立的項(xiàng)目和大型項(xiàng)目。
1、說明
GIL規(guī)定一個(gè)Python解釋程序只能同時(shí)由一個(gè)線程控制。
在CPU限制類型和多線程代碼中,GIL是一個(gè)性能瓶頸。
GIL使Python多線程成為偽并行多線程。
僅CPython解釋器上存在GIL。
2、原理
(1)線程1、2、3輪流執(zhí)行,每一個(gè)線程在執(zhí)行是,都會(huì)鎖住GIL,以阻止別的線程執(zhí)行;
同樣的,每一個(gè)線程執(zhí)行一段后,會(huì)釋放GIL,以允許別的線程開始利用資源。
(2)由于古老GIL機(jī)制,如果線程2需要在CPU2上執(zhí)行,它需要先等待在CPU1上執(zhí)行的線程1釋放GIL(記住:GIL是全局的)
(3)如果線程1是因?yàn)?i/o 阻塞讓出的GIL,那么線程2必定拿到GIL。但如果線程1是因?yàn)閠imer ticks計(jì)數(shù)滿100ticks(大概對(duì)應(yīng)了1000個(gè)bytecodes)讓出GIL,那么這個(gè)時(shí)候線程1和線程2公平競(jìng)爭(zhēng)。
(4)但要命的是,在Python 2.x, 線程1不會(huì)動(dòng)態(tài)的調(diào)整自身的優(yōu)先級(jí),所以很大概率下次被選中執(zhí)行的還是線程1,在很多個(gè)這樣的選舉周期內(nèi),線程2只能安靜的看著線程1拿著GIL在CPU 1上歡快的執(zhí)行。
(5)極端一點(diǎn)的情況下,比如線程1使用了while True在CPU1上執(zhí)行,那就真是“一核有難,八核圍觀”了。
以上是“python中GIL的原理分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!