python3爬蟲GIL修改多線程實(shí)例講解
我們打開程序后,會(huì)發(fā)現(xiàn)電腦的內(nèi)存和cpu發(fā)生了變化。在對(duì)于前者上面,自然是希望內(nèi)容占用小,cpu的利用越高越好。那有沒(méi)有什么方法可以讓我們的cpu達(dá)到滿狀態(tài)的運(yùn)行效果呢?這就得用到我們所學(xué)的多線程中的知識(shí)了,再正式開始講解之前,我們先來(lái)說(shuō)說(shuō)操作的思路吧,然后進(jìn)行代碼對(duì)比。
我們都知道,比方我有一個(gè)4核的CPU,那么這樣一來(lái),在單位時(shí)間內(nèi)每個(gè)核只能跑一個(gè)線程,然后時(shí)間片輪轉(zhuǎn)切換。但是Python不一樣,它不管你有幾個(gè)核,單位時(shí)間多個(gè)核只能跑一個(gè)線程,然后時(shí)間片輪轉(zhuǎn)??雌饋?lái)很不可思議?但是這就是GIL搞的鬼。任何Python線程執(zhí)行前,必須先獲得GIL鎖,然后,每執(zhí)行100條字節(jié)碼,解釋器就自動(dòng)釋放GIL鎖,讓別的線程有機(jī)會(huì)執(zhí)行。這個(gè)GIL全局鎖實(shí)際上把所有線程的執(zhí)行代碼都給上了鎖,所以,多線程在Python中只能交替執(zhí)行,即使100個(gè)線程跑在100核CPU上,也只能用到1個(gè)核。通常我們用的解釋器是官方實(shí)現(xiàn)的CPython,要真正利用多核,除非重寫一個(gè)不帶GIL的解釋器。我們不妨做個(gè)試驗(yàn):
#coding=utf-8 from multiprocessing import Pool from threading import Thread from multiprocessing import Process def loop(): while True: pass if __name__ == '__main__': for i in range(3): t = Thread(target=loop) t.start() while True: pass
我的電腦是4核,所以我開了4個(gè)線程,看一下CPU資源占有率:
我們發(fā)現(xiàn)CPU利用率并沒(méi)有占滿,大致相當(dāng)于單核水平。
而如果我們變成進(jìn)程呢?
我們改一下代碼:
#coding=utf-8 from multiprocessing import Pool from threading import Thread from multiprocessing import Process def loop(): while True: pass if __name__ == '__main__': for i in range(3): t = Process(target=loop) t.start() Pass
結(jié)果直接飆到了100%,說(shuō)明進(jìn)程是可以利用多核的!
以上就是python3爬蟲GIL修改多線程實(shí)例講解的詳細(xì)內(nèi)容,更多關(guān)于python3爬蟲中的GIL修改多線程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
如何用python實(shí)現(xiàn)復(fù)制粘貼功能
這篇文章主要介紹了如何用python實(shí)現(xiàn)復(fù)制粘貼功能,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-03-03pandas中Series和DataFrame的rank方法解析
pandas中的rank方法是用于數(shù)據(jù)排名的重要工具,它不返回排序后的數(shù)據(jù),而是數(shù)據(jù)的排名。rank方法可以處理相同數(shù)據(jù)的排名,通過(guò)平均排名方式解決排名沖突,并支持自定義排序規(guī)則及逆序排名。此外,DataFrame的rank方法允許在行或列上計(jì)算排名2024-09-09Python最基本的數(shù)據(jù)類型以及對(duì)元組的介紹
這篇文章主要介紹了Python最基本的數(shù)據(jù)類型以及對(duì)元組的介紹,來(lái)自于IBM官方網(wǎng)站技術(shù)文檔,需要的朋友可以參考下2015-04-04numpy.ndarray 實(shí)現(xiàn)對(duì)特定行或列取值
今天小編就為大家分享一篇numpy.ndarray 實(shí)現(xiàn)對(duì)特定行或列取值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12Python virtualenv虛擬環(huán)境實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了Python virtualenv虛擬環(huán)境實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04