欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

摘要

什么是線程安全? 為什么python會使用GIL的機制?

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

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

引入

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

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

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

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

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

相對于進程的輕型特征,多線程環(huán)境有個最大的問題就是 如何保證資源競爭,死鎖, 數(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)境下, 線程安全能夠保證多個線程同時執(zhí)行時程序依舊運行正確, 而且要保證對于共享的數(shù)據(jù),可以由多個線程存取,但是同一時刻只能有一個線程進行存取.

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

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

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

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

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

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

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

GIL

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

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

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

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

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

反對 GIL 的聲音:

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

認為 GIL 不能去除的:

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

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

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

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

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

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

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

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

歸根結(jié)底,其實就是多進程與多線程的選擇問題, 有一段話比較有意思, 可以參考 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 對 Guido 的回復(fù). 而 Bruce Eckel 是何許人, 如果你了解 java 或者 C++, 那么應(yīng)該不會不知道他.

個人的觀點

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

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

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

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

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

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

相關(guān)文章

  • Python  中的pass語句語法詳析

    Python  中的pass語句語法詳析

    這篇文章主要介紹了Python 中的pass語句語法詳析,pass是一種空操作(null operation),解釋器執(zhí)行到它的時候,除了檢查語法是否合法,什么也不做就直接跳過
    2022-07-07
  • Qt Quick QML-500行代碼實現(xiàn)合成大西瓜游戲

    Qt Quick QML-500行代碼實現(xiàn)合成大西瓜游戲

    合成大西瓜游戲是前段時間比較火的小游戲,最近小編閑來無事,通過研究小球碰撞原理親自寫碰撞算法實現(xiàn)一個合成大西瓜游戲,下面小編把我的實現(xiàn)思路及核心代碼分析出來,供大家參考
    2021-05-05
  • 基于python的圖片修復(fù)程序(實現(xiàn)水印去除)

    基于python的圖片修復(fù)程序(實現(xiàn)水印去除)

    這篇文章主要給大家介紹了關(guān)于python圖片修復(fù)程序的相關(guān)資料,可以用于實現(xiàn)圖片中水印去除,主要利用的是OpenCV這個框架實現(xiàn)的,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧
    2018-06-06
  • Python基礎(chǔ)語言學(xué)習(xí)筆記總結(jié)(精華)

    Python基礎(chǔ)語言學(xué)習(xí)筆記總結(jié)(精華)

    給大家分享一篇關(guān)于Python基礎(chǔ)學(xué)習(xí)內(nèi)容的學(xué)習(xí)筆記整理總結(jié)篇,里面匯集了學(xué)習(xí)Python基礎(chǔ)語言的難點和技巧,分享給大家。
    2017-11-11
  • Python簡明講解filter函數(shù)的用法

    Python簡明講解filter函數(shù)的用法

    本文和你一起來探索Python中的filter函數(shù),讓你以最短的時間明白這個函數(shù)的原理。也可以利用碎片化的時間鞏固這個函數(shù),讓你在處理工作過程中更高效
    2022-06-06
  • Python字典中的鍵映射多個值的方法(列表或者集合)

    Python字典中的鍵映射多個值的方法(列表或者集合)

    今天小編就為大家分享一篇Python字典中的鍵映射多個值的方法(列表或者集合),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • 通過底層源碼理解YOLOv5的Backbone

    通過底層源碼理解YOLOv5的Backbone

    yolov5的特征提取網(wǎng)絡(luò)兼顧速度與精度,將PAN與PFN深度融合,對不同尺度魯棒性強,可以即插即用,后接不同的檢測器,下面這篇文章主要給大家介紹了關(guān)于如何通過底層源碼理解YOLOv5的Backbone的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • python shutil操作文件實例講解

    python shutil操作文件實例講解

    在本篇文章里小編給大家整理了一篇關(guān)于python shutil操作文件實例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-03-03
  • python基礎(chǔ)--除法(/,//,%)的應(yīng)用說明

    python基礎(chǔ)--除法(/,//,%)的應(yīng)用說明

    這篇文章主要介紹了python基礎(chǔ)--除法(/,//,%)的應(yīng)用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Python抓取網(wǎng)頁圖片難點分析

    Python抓取網(wǎng)頁圖片難點分析

    沒想到python是如此強大,令人著迷,以前看見圖片總是一張一張復(fù)制粘貼,現(xiàn)在好了,學(xué)會python就可以用程序?qū)⒁粡垙垐D片,保存下來。今天網(wǎng)上沖浪看到很多美圖,可是圖片有點多,不想一張一張地復(fù)制粘貼,怎么辦呢?辦法總是有的,即便沒有我們也可以創(chuàng)造一個辦法
    2023-01-01

最新評論