最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

線程安全及Python中的GIL原理分析

 更新時(shí)間:2019年10月29日 10:12:56   作者:Tower Joo  
這篇文章主要介紹了線程安全及Python中的GIL原理,較為詳細(xì)的分析了線程安全及Python中的GIL相關(guān)概念、原理、理解及操作注意事項(xiàng),需要的朋友可以參考下

本文講述了線程安全及Python中的GIL。分享給大家供大家參考,具體如下:

摘要

什么是線程安全? 為什么python會(huì)使用GIL的機(jī)制?

在多核時(shí)代的到來的背景下,基于多線程來充分利用硬件的編程方法也不斷發(fā)展起來, 但是一旦 牽扯到多線程,就必然會(huì)涉及到一個(gè)概念,即 線程安全, 本文就主要談下筆者對(duì)線程安全的一些理解.

而Python為很多人所抱怨的一點(diǎn)就是GIL,那么python為什么選擇使用GIL, 本文也就這個(gè)問題進(jìn)行一些討論.

引入

你的PC或者筆記本還是單核嗎? 如果是,那你已經(jīng)out了.

隨著納米技術(shù)的不斷進(jìn)步, 計(jì)算機(jī)芯片的工藝也在進(jìn)步,但是已經(jīng)很難在工藝上的改進(jìn)來提高 運(yùn)算速度而滿足 摩爾定理, 所以intel, amd相繼在采用橫向的擴(kuò)展即增加更多的CPU, 從而雙核, 4核, N核不斷推出,于是我們進(jìn)入了多核時(shí)代.

于是一個(gè)問題出現(xiàn)了, 多核時(shí)代的出現(xiàn)對(duì)于我們程序員而言意味著什么, 我們?nèi)绾卫枚嗪说膬?yōu)勢?

在回答這個(gè)問題之前,建議對(duì) 進(jìn)程 和 線程 不熟悉的讀者可以先補(bǔ)下相關(guān)的知識(shí).

當(dāng)然方案是,可以采用 多進(jìn)程, 也可以采用 多線程. 二者的最大區(qū)別就是, 是否共享資源, 后者是共享資源的,而前者是獨(dú)立的. 所以你也可能想起了google chrome為什么又開始使用獨(dú)立的進(jìn)程 來作為每個(gè)tab服務(wù)了(不共享數(shù)據(jù),意味著有更好的安全性).

相對(duì)于進(jìn)程的輕型特征,多線程環(huán)境有個(gè)最大的問題就是 如何保證資源競爭,死鎖, 數(shù)據(jù)修改等.

于是,便有了 線程安全 (thread safety)的提出.

線程安全

Thread safety is a computer programming concept applicable in the context of multi-threaded programs.
A piece of code is thread-safe if it functions correctly during simultaneous execution by multiple threads.
In particular, it must satisfy the need for multiple threads to access the same shared data,
and the need for a shared piece of data to be accessed by only one thread at any given time.

上面是wikipedia中的解釋, 換句話說, 線程安全 是在多線程的環(huán)境下, 線程安全能夠保證多個(gè)線程同時(shí)執(zhí)行時(shí)程序依舊運(yùn)行正確, 而且要保證對(duì)于共享的數(shù)據(jù),可以由多個(gè)線程存取,但是同一時(shí)刻只能有一個(gè)線程進(jìn)行存取.

既然,多線程環(huán)境下必須存在資源的競爭,那么如何才能保證同一時(shí)刻只有一個(gè)線程對(duì)共享資源進(jìn)行存取?

加鎖, 對(duì), 加鎖可以保證存取操作的唯一性, 從而保證同一時(shí)刻只有一個(gè)線程對(duì)共享數(shù)據(jù)存取.

通常加鎖也有2種不同的粒度的鎖:

  • fine-grained(所謂的細(xì)粒度), 那么程序員需要自行地加,解鎖來保證線程安全
  • coarse-grained(所謂的粗粒度), 那么語言層面本身維護(hù)著一個(gè)全局的鎖機(jī)制,用來保證線程安全

前一種方式比較典型的是 java, Jython 等, 后一種方式比較典型的是 CPython (即Python).

前一種本文不進(jìn)行討論, 具體可參考 java 中的多線程編程部分.

至于Python中的全局鎖機(jī)制,也即 GIL (Global Interpreter Lock), 下面主要進(jìn)行一些討論.

GIL

什么是 GIL ? 答案可參考wikipedia中的說明, 簡單地說就是:

每一個(gè)interpreter進(jìn)程,只能同時(shí)僅有一個(gè)線程來執(zhí)行, 獲得相關(guān)的鎖, 存取相關(guān)的資源.

那么很容易就會(huì)發(fā)現(xiàn),如果一個(gè)interpreter進(jìn)程只能有一個(gè)線程來執(zhí)行, 多線程的并發(fā)則成為不可能, 即使這幾個(gè)線程之間不存在資源的競爭.

從理論上講,我們要盡可能地使程序更加并行, 能夠充分利用多核的功能, 那么Python為什么要使用 全局的 GIL 來限制這種并行呢?

這個(gè)問題,其實(shí)已經(jīng)得到了很多的討論, 不止十年, 可以參考下面的文檔:

反對(duì) GIL 的聲音:

  • An open letter to Guido van Rossum (這個(gè)文章值得一看,下面有很多的留言也值得一看)

認(rèn)為 GIL 不能去除的:

  • It isn't Easy to Remove the GIL (這個(gè)文章來自python作者 Guido, 他說明了什么要使用 GIL)

其它的一些討論很容易從Google來搜索得到, 譬如: GIL at google.

那么,簡單總結(jié)下雙方的觀點(diǎn).

認(rèn)為應(yīng)該去除 GIL 的:

  • 不順應(yīng)計(jì)算機(jī)的發(fā)展潮流(多核時(shí)代已經(jīng)到來, 而 GIL 會(huì)很影響多核的使用)
  • 大幅度提升多線程程序的速度

認(rèn)為不應(yīng)該去除 GIL 的(如果去掉,會(huì)):

  • 寫python的擴(kuò)展(module)時(shí)會(huì)遇到鎖的問題,程序員需要繁瑣地加解鎖來保證線程安全
  • 會(huì)較大幅度地減低單線程程序的速度

后者是 Guido 最為關(guān)切的, 也是不去除 GIL 最重要的原因, 一個(gè)簡單的嘗試是在1999年(十年前), 最終的結(jié)果是導(dǎo)致單線程的程序速度下降了幾乎2倍.

歸根結(jié)底,其實(shí)就是多進(jìn)程與多線程的選擇問題, 有一段話比較有意思, 可以參考 http://www.artima.com/forums/flat.jsp?forum=106&thread=214235.

我引用如下:

I actually don't think removing the GIL is a good solution.
But I don't think threads are a good solution, either.
They're too hard to get right, and I say that after spending literally years studying threading in both C++ and Java.
Brian Goetz has taken to saying that no one can get threading right.

引自 Bruce Eckel 對(duì) Guido 的回復(fù). 而 Bruce Eckel 是何許人, 如果你了解 java 或者 C++, 那么應(yīng)該不會(huì)不知道他.

個(gè)人的觀點(diǎn)

那么,從我自己的角度來看(我沒有太多的多線程編程經(jīng)驗(yàn)), 先不論多線程的速度優(yōu)勢等,我更加喜歡多進(jìn)程的是:

  • 簡單,無需要人為(或者語言級(jí)別)的加解鎖. 想想 java 中的多線程編程,程序員通常會(huì)在此處出錯(cuò)(java程序員可以思考下)
  • 安全, 這也是瀏覽器為什么開始使用多進(jìn)程的一個(gè)原因

依照Python自身的哲學(xué), 簡單 是一個(gè)很重要的原則,所以, 使用 GIL 也是很好理解的.

當(dāng)然你真的需要充分利用多核的速度優(yōu)勢,此時(shí)python可能并非你最佳的選擇,請考慮別的語言吧,如 java, erlang 等.

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python進(jìn)程與線程操作技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》、《Python+MySQL數(shù)據(jù)庫程序設(shè)計(jì)入門教程》及《Python常見數(shù)據(jù)庫操作技巧匯總

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Python中按鍵來獲取指定的值

    Python中按鍵來獲取指定的值

    今天小編就為大家分享一篇關(guān)于Python中按鍵來獲取指定的值,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Django框架實(shí)現(xiàn)分頁顯示內(nèi)容的方法詳解

    Django框架實(shí)現(xiàn)分頁顯示內(nèi)容的方法詳解

    這篇文章主要介紹了Django框架實(shí)現(xiàn)分頁顯示內(nèi)容的方法,結(jié)合實(shí)例形式詳細(xì)分析了Django框架引入bootstrap樣式進(jìn)行分頁顯示相關(guān)步驟、實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下
    2019-05-05
  • Python語言在AI中的常用工具和應(yīng)用場景

    Python語言在AI中的常用工具和應(yīng)用場景

    文章探討了TensorFlow、PyTorch和Keras等流行的深度學(xué)習(xí)框架,以及Scikit-learn等用于機(jī)器學(xué)習(xí)的庫,文章還舉例說明了AI在自然語言處理、圖像識(shí)別、語音識(shí)別和推薦系統(tǒng)等領(lǐng)域的實(shí)際應(yīng)用場景,并介紹了如何使用Python調(diào)用AI大模型的接口
    2025-02-02
  • Python 命令行參數(shù)sys.argv

    Python 命令行參數(shù)sys.argv

    命令行參數(shù)是通過sys.argv[]來獲取的,sys.argv[0]是代碼文件本身的路徑,因此參數(shù)是從1開始的。比如設(shè)置參數(shù)為: spe
    2008-09-09
  • Flask框架Jinjia模板常用語法總結(jié)

    Flask框架Jinjia模板常用語法總結(jié)

    這篇文章主要介紹了Flask框架Jinjia模板常用語法,結(jié)合實(shí)例形式總結(jié)分析了Jinjia模板的變量、賦值、流程控制、函數(shù)、塊、宏等基本使用方法,需要的朋友可以參考下
    2018-07-07
  • Pytorch使用MNIST數(shù)據(jù)集實(shí)現(xiàn)CGAN和生成指定的數(shù)字方式

    Pytorch使用MNIST數(shù)據(jù)集實(shí)現(xiàn)CGAN和生成指定的數(shù)字方式

    今天小編就為大家分享一篇Pytorch使用MNIST數(shù)據(jù)集實(shí)現(xiàn)CGAN和生成指定的數(shù)字方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Python+numpy實(shí)現(xiàn)矩陣的行列擴(kuò)展方式

    Python+numpy實(shí)現(xiàn)矩陣的行列擴(kuò)展方式

    今天小編就為大家分享一篇Python+numpy實(shí)現(xiàn)矩陣的行列擴(kuò)展方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Python代碼打開本地.mp4格式文件的方法

    Python代碼打開本地.mp4格式文件的方法

    今天小編就為大家分享一篇Python代碼打開本地.mp4格式文件的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python編寫帶選項(xiàng)的命令行程序方法

    Python編寫帶選項(xiàng)的命令行程序方法

    今天小編就為大家分享一篇Python編寫帶選項(xiàng)的命令行程序方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Python實(shí)現(xiàn)Harbor私有鏡像倉庫垃圾自動(dòng)化清理詳情

    Python實(shí)現(xiàn)Harbor私有鏡像倉庫垃圾自動(dòng)化清理詳情

    這篇文章主要介紹了Python實(shí)現(xiàn)Harbor私有鏡像倉庫垃圾自動(dòng)化清理詳情,文章圍繞主題分享相關(guān)詳細(xì)代碼,需要的小伙伴可以參考一下
    2022-05-05

最新評(píng)論

昭平县| 绍兴市| 孙吴县| 旅游| 社旗县| 潼南县| 河北省| 景谷| 宿松县| 家居| 朝阳市| 永安市| 神池县| 乡宁县| 银川市| 方山县| 寿阳县| 白城市| 沈阳市| 图木舒克市| 南江县| 绩溪县| 阿勒泰市| 陆川县| 苏尼特左旗| 余庆县| 泸西县| 盐源县| 徐州市| 玉龙| 太白县| 本溪市| 安康市| 扬州市| 青川县| 吴桥县| 诸城市| 彰化市| 蒙山县| 富平县| 台南市|