成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺析Python的GIL和線程安全

開發(fā) 后端
在這里我們將介紹Python的GIL和線程安全,希望大家能從中理解Python里的GIL,以及GIL的前世今生。

對(duì)于Python的GIL和線程安全很多人不是很了解,通過(guò)本文,希望能讓大家對(duì)Python的GIL等內(nèi)容有所幫助。本文還將就主要談下筆者對(duì)線程安全的一些理解。

摘要

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

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

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

Contents

摘要

引入

線程安全

GIL

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

參考資料

本文的rst源碼

引入

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

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

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

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

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

相對(duì)于進(jìn)程的輕型特征,多線程環(huán)境有個(gè)***的問(wèn)題就是 如何保證資源競(jìng)爭(zhēng),死鎖, 數(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中的解釋, 換句話說(shuō), 線程安全 是在多線程的環(huán)境下, 線程安全能夠保證多個(gè)線程同時(shí)執(zhí)行時(shí)程序依舊運(yùn)行正確, 而且要保證對(duì)于共享的數(shù)據(jù),可以由多個(gè)線程存取,但是同一時(shí)刻只能有一個(gè)線程進(jìn)行存取.

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

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

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

fine-grained(所謂的細(xì)粒度), 那么程序員需要自行地加,解鎖來(lái)保證線程安全

coarse-grained(所謂的粗粒度), 那么語(yǔ)言層面本身維護(hù)著一個(gè)全局的鎖機(jī)制,用來(lái)保證線程安全

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

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

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

Python的GIL

什么是GIL ? 答案可參考wikipedia中的說(shuō)明, 簡(jiǎn)單地說(shuō)就是:

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

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

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

這個(gè)問(wèn)題,其實(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è)文章來(lái)自python作者 Guido, 他說(shuō)明了什么要使用 GIL)

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

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

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

不順應(yīng)計(jì)算機(jī)的發(fā)展潮流(多核時(shí)代已經(jīng)到來(lái), 而 GIL 會(huì)很影響多核的使用)

大幅度提升多線程程序的速度

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

寫python的擴(kuò)展(module)時(shí)會(huì)遇到鎖的問(wèn)題,程序員需要繁瑣地加解鎖來(lái)保證線程安全

會(huì)較大幅度地減低單線程程序的速度

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

歸根結(jié)底,其實(shí)就是多進(jìn)程與多線程的選擇問(wè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)

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

簡(jiǎn)單,無(wú)需要人為(或者語(yǔ)言級(jí)別)的加解鎖. 想想 java 中的多線程編程,程序員通常會(huì)在此處出錯(cuò)(Java程序員可以思考下)

安全, 這也是瀏覽器為什么開始使用多進(jìn)程的一個(gè)原因

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

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

原文標(biāo)題:線程安全及Python中的GIL

鏈接:http://www.cnblogs.com/mindsbook/archive/2009/10/15/thread-safety-and-GIL.html

【編輯推薦】

  1. 分析Python 3.1核心語(yǔ)言的變化
  2. PHP老手談PHP和Python的基礎(chǔ)特性
  3. Ruby和Python的語(yǔ)法比較
  4. Ruby使用心得匯總:尋找高效的實(shí)現(xiàn)
  5. 對(duì)話Python之父:Python的成功之路
責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2017-05-26 09:50:19

PythonGIL線程安全

2010-02-01 17:25:09

Python多線程

2012-01-17 17:21:24

JavaSwing

2010-02-02 14:11:14

Python 進(jìn)行編程

2009-07-31 17:35:02

ASP.NET線程安全

2010-02-01 17:50:32

Python裝飾器

2010-02-01 10:04:25

Python模板函數(shù)

2014-08-13 10:41:08

linux線程

2011-04-06 13:39:18

2013-08-22 15:47:22

2022-11-24 13:17:43

2023-12-13 18:33:17

2010-02-03 15:09:13

Python 構(gòu)建工具

2009-08-21 11:31:59

異步和多線程的區(qū)別

2019-06-17 07:26:04

物聯(lián)網(wǎng)安全物聯(lián)網(wǎng)IOT

2011-05-27 14:18:39

2021-04-08 10:01:40

Python模塊的引入調(diào)用

2010-03-03 17:44:07

Python多線程

2009-06-11 17:03:29

Java線程

2017-07-21 09:40:35

Python類、繼承和多態(tài)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日本黄视频在线观看 | 夜夜草视频 | 久久69精品久久久久久久电影好 | 国产精品永久免费视频 | 日韩视频在线播放 | 午夜免费网站 | 国产成人在线一区二区 | 国产欧美在线视频 | 中文字幕国产一区 | 男女又爽又黄视频 | 成人在线小视频 | 中文字幕在线视频免费视频 | 久久精品亚洲精品国产欧美kt∨ | 日韩精品久久久 | 熟女毛片 | 成人av网站在线观看 | 2023亚洲天堂 | 欧美一级大片 | 日韩欧美专区 | 欧美成人一区二免费视频软件 | 91av视频在线免费观看 | 狠狠的日 | 日韩精品免费在线 | 超碰一区二区 | 东方伊人免费在线观看 | 超碰一区二区 | 中国一级毛片免费 | 一区二区三区四区在线视频 | 免费日韩av| 精品亚洲一区二区 | 美女国产精品 | 国产欧美日韩在线播放 | 日韩精品专区在线影院重磅 | 日韩在线免费 | 久久精品福利视频 | 国产精品视频免费观看 | 国产免费观看一级国产 | 97色综合| 黄色片视频免费 | 国产精品日韩欧美一区二区 | 香蕉久久久 |