日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GIL全局解释器锁

發布時間:2025/7/25 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GIL全局解释器锁 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Python GIL(Global Interpreter Lock)

閱讀目錄

  • 一 介紹
  • 二 GIL介紹
  • 三 GIL與Lock
  • 四 GIL與多線程
  • 五 多線程性能測試

一 介紹

''' 定義: In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.) ''' 結論:在Cpython解釋器中,同一個進程下開啟的多線程,同一時刻只能有一個線程執行,無法利用多核優勢

首先需要明確的一點是GIL并不是Python的特性,它是在實現Python解析器(CPython)時所引入的一個概念。就好比C++是一套語言(語法)標準,但是可以用不同的編譯器來編譯成可執行代碼。有名的編譯器例如GCC,INTEL C++,Visual C++等。Python也一樣,同樣一段代碼可以通過CPython,PyPy,Psyco等不同的Python執行環境來執行。像其中的JPython就沒有GIL。然而因為CPython是大部分環境下默認的Python執行環境。所以在很多人的概念里CPython就是Python,也就想當然的把GIL歸結為Python語言的缺陷。所以這里要先明確一點:GIL并不是Python的特性,Python完全可以不依賴于GIL

這篇文章透徹的剖析了GIL對python多線程的影響,強烈推薦看一下:http://www.dabeaz.com/python/UnderstandingGIL.pdf?

二 GIL介紹

GIL本質就是一把互斥鎖,既然是互斥鎖,所有互斥鎖的本質都一樣,都是將并發運行變成串行,以此來控制同一時間內共享數據只能被一個任務所修改,進而保證數據安全。

可以肯定的一點是:保護不同的數據的安全,就應該加不同的鎖。

要想了解GIL,首先確定一點:每次執行python程序,都會產生一個獨立的進程。例如python test.py,python aaa.py,python bbb.py會產生3個不同的python進程

''' #驗證python test.py只會產生一個進程 #test.py內容 import os,time print(os.getpid()) time.sleep(1000) ''' python3 test.py #在windows下 tasklist |findstr python #在linux下 ps aux |grep python

在一個python的進程內,不僅有test.py的主線程或者由該主線程開啟的其他線程,還有解釋器開啟的垃圾回收等解釋器級別的線程,總之,所有線程都運行在這一個進程內,毫無疑問

#1 所有數據都是共享的,這其中,代碼作為一種數據也是被所有線程共享的(test.py的所有代碼以及Cpython解釋器的所有代碼) 例如:test.py定義一個函數work(代碼內容如下圖),在進程內所有線程都能訪問到work的代碼,于是我們可以開啟三個線程然后target都指向該代碼,能訪問到意味著就是可以執行。#2 所有線程的任務,都需要將任務的代碼當做參數傳給解釋器的代碼去執行,即所有的線程要想運行自己的任務,首先需要解決的是能夠訪問到解釋器的代碼。

?

綜上:

如果多個線程的target=work,那么執行流程是

多個線程先訪問到解釋器的代碼,即拿到執行權限,然后將target的代碼交給解釋器的代碼去執行

解釋器的代碼是所有線程共享的,所以垃圾回收線程也可能訪問到解釋器的代碼而去執行,這就導致了一個問題:對于同一個數據100,可能線程1執行x=100的同時,而垃圾回收執行的是回收100的操作,解決這種問題沒有什么高明的方法,就是加鎖處理,如下圖的GIL,保證python解釋器同一時間只能執行一個任務的代碼

三 GIL與Lock

GIL保護的是解釋器級的數據,保護用戶自己的數據則需要自己加鎖處理,如下圖

四 GIL與多線程

有了GIL的存在,同一時刻同一進程中只有一個線程被執行

聽到這里,有的同學立馬質問:進程可以利用多核,但是開銷大,而python的多線程開銷小,但卻無法利用多核優勢,也就是說python沒用了,php才是最牛逼的語言?

別著急啊,老娘還沒講完呢。

要解決這個問題,我們需要在幾個點上達成一致:

#1. cpu到底是用來做計算的,還是用來做I/O的?#2. 多cpu,意味著可以有多個核并行完成計算,所以多核提升的是計算性能#3. 每個cpu一旦遇到I/O阻塞,仍然需要等待,所以多核對I/O操作沒什么用處?

一個工人相當于cpu,此時計算相當于工人在干活,I/O阻塞相當于為工人干活提供所需原材料的過程,工人干活的過程中如果沒有原材料了,則工人干活的過程需要停止,直到等待原材料的到來。

如果你的工廠干的大多數任務都要有準備原材料的過程(I/O密集型),那么你有再多的工人,意義也不大,還不如一個人,在等材料的過程中讓工人去干別的活,

反過來講,如果你的工廠原材料都齊全,那當然是工人越多,效率越高

?

結論:

  對計算來說,cpu越多越好,但是對于I/O來說,再多的cpu也沒用

  當然對運行一個程序來說,隨著cpu的增多執行效率肯定會有所提高(不管提高幅度多大,總會有所提高),這是因為一個程序基本上不會是純計算或者純I/O,所以我們只能相對的去看一個程序到底是計算密集型還是I/O密集型,從而進一步分析python的多線程到底有無用武之地

#分析: 我們有四個任務需要處理,處理方式肯定是要玩出并發的效果,解決方案可以是: 方案一:開啟四個進程 方案二:一個進程下,開啟四個線程#單核情況下,分析結果: 如果四個任務是計算密集型,沒有多核來并行計算,方案一徒增了創建進程的開銷,方案二勝如果四個任務是I/O密集型,方案一創建進程的開銷大,且進程的切換速度遠不如線程,方案二勝#多核情況下,分析結果:如果四個任務是計算密集型,多核意味著并行計算,在python中一個進程中同一時刻只有一個線程執行用不上多核,方案一勝如果四個任務是I/O密集型,再多的核也解決不了I/O問題,方案二勝#結論:現在的計算機基本上都是多核,python對于計算密集型的任務開多線程的效率并不能帶來多大性能上的提升,甚至不如串行(沒有大量切換),但是,對于IO密集型的任務效率還是有顯著提升的。

五 多線程性能測試

from multiprocessing import Process from threading import Thread import os,time def work():res=0for i in range(100000000):res*=iif __name__ == '__main__':l=[]print(os.cpu_count()) #本機為4核start=time.time()for i in range(4):p=Process(target=work) #耗時5s多p=Thread(target=work) #耗時18s多l.append(p)p.start()for p in l:p.join()stop=time.time()print('run time is %s' %(stop-start)) from multiprocessing import Process from threading import Thread import threading import os,time def work():time.sleep(2)print('===>')if __name__ == '__main__':l=[]print(os.cpu_count()) #本機為4核start=time.time()for i in range(400):# p=Process(target=work) #耗時12s多,大部分時間耗費在創建進程上p=Thread(target=work) #耗時2s多l.append(p)p.start()for p in l:p.join()stop=time.time()print('run time is %s' %(stop-start))

應用:

多線程用于IO密集型,如socket,爬蟲,web
多進程用于計算密集型,如金融分析

本人水平有限,博客轉自林海峰老師http://www.cnblogs.com/linhaifeng

轉載于:https://www.cnblogs.com/zhaodafa/p/8962650.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的GIL全局解释器锁的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 三级黄色片网站 | 朝桐光av在线 | 中文字幕高清一区 | 夜夜添无码一区二区三区 | 久草免费在线视频观看 | 亚洲精品97久久中文字幕无码 | 亚洲自拍偷拍一区二区 | 日韩色一区 | 香蕉视频99| 奇米影视首页 | 日本精品一区二区三区四区的功能 | 涩涩的视频在线观看 | 日日摸天天爽天天爽视频 | 日批大全 | 午夜国产福利视频 | 无码日韩精品一区二区 | 国产成人一区二区三区电影 | 97av.com| 西野翔夫の目の前で犯在线 | 亚洲第一色视频 | 国产精品系列在线观看 | 日批在线播放 | 国产精品一区二区三区在线看 | 椎名空在线 | 伊人久久久久久久久久久久久 | 搡老熟女老女人一区二区 | 亚洲网站在线 | 国产色网站 | 欧美成人黄色网 | 波多野结衣一区二 | 中文字幕黄色av | 欧美美女一区二区 | 3344成人| 日韩精品一区二区在线 | 黄色网址在线免费看 | 免费av一区 | 久久国产精品二区 | 午夜寂寞影院在线观看 | 日韩精品中文字幕在线 | a级黄色在线观看 | 99re5| 麻豆免费网站 | 国产精品社区 | 国产美女激情 | 911亚洲精选 | 欧美成人午夜视频 | 日日夜夜中文字幕 | 一区二区自拍 | 日日撸视频 | 亚洲制服丝袜一区 | 第一页国产 | 人人妻一区二区三区 | 永久免费看片在线观看 | 欧美成人三级在线播放 | 国产美女黄色片 | 欧美精品在线免费 | 久久91精品| 免费看60分钟黄视频 | 久久最新免费视频 | 荡女精品导航 | 国产做爰免费观看 | 欧美激情 在线 | 淫僧荡尼巨乳(h)小说 | 亚洲综合色自拍一区 | 国产在线无码精品 | 在线观看欧美亚洲 | 草莓视频在线观看入口w | 色猫咪av| 国产精品亚洲а∨天堂免在线 | 精品国产一区二区三区四区阿崩 | 亚洲GV成人无码久久精品 | 婷婷伊人综合中文字幕 | 久久电影一区二区 | 香蕉视频成人在线 | 亚洲一级黄色片 | 成人性生交大片免费卡看 | 色多多av| 91精品久久久久久粉嫩 | 麻豆av免费观看 | 欧美日本一区二区 | 欧美专区在线播放 | 国产明星换脸xxxx色视频 | 成人xx视频 | 国产精品午夜影院 | 欧美亚洲不卡 | 国产精品福利在线观看 | 亚洲国产综合在线 | 午夜av激情| 精品在线视频播放 | 国产人妖av | 郑艳丽三级 | 欧美久久一区二区 | 亚洲色图丝袜 | 国产激情av一区二区三区 | 老女人乱淫 | 91这里只有精品 | 韩日av网站 | 男女一级黄色 | 欧日韩不卡视频 |