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

淺析Python的GIL和線程安全

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

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

摘要

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

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

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

Contents

摘要

引入

線程安全

GIL

個人的觀點

參考資料

本文的rst源碼

引入

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

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

于是一個問題出現了, 多核時代的出現對于我們程序員而言意味著什么, 我們如何利用多核的優勢?

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

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

相對于進程的輕型特征,多線程環境有個***的問題就是 如何保證資源競爭,死鎖, 數據修改等.

于是,便有了 線程安全 (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中的解釋, 換句話說, 線程安全 是在多線程的環境下, 線程安全能夠保證多個線程同時執行時程序依舊運行正確, 而且要保證對于共享的數據,可以由多個線程存取,但是同一時刻只能有一個線程進行存取.

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

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

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

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

coarse-grained(所謂的粗粒度), 那么語言層面本身維護著一個全局的鎖機制,用來保證線程安全

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

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

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

Python的GIL

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

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

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

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

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

反對GIL的聲音:

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

認為GIL不能去除的:

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

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

那么,簡單總結下雙方的觀點.

認為應該去除GIL的:

不順應計算機的發展潮流(多核時代已經到來, 而 GIL 會很影響多核的使用)

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

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

寫python的擴展(module)時會遇到鎖的問題,程序員需要繁瑣地加解鎖來保證線程安全

會較大幅度地減低單線程程序的速度

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

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

個人的觀點

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

簡單,無需要人為(或者語言級別)的加解鎖. 想想 java 中的多線程編程,程序員通常會在此處出錯(Java程序員可以思考下)

安全, 這也是瀏覽器為什么開始使用多進程的一個原因

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

當然你真的需要充分利用多核的速度優勢,此時python可能并非你***的選擇,請考慮別的語言吧,如Java, erlang 等.

原文標題:線程安全及Python中的GIL

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

【編輯推薦】

  1. 分析Python 3.1核心語言的變化
  2. PHP老手談PHP和Python的基礎特性
  3. Ruby和Python的語法比較
  4. Ruby使用心得匯總:尋找高效的實現
  5. 對話Python之父:Python的成功之路
責任編輯:彭凡 來源: 博客園
相關推薦

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 進行編程

2009-07-31 17:35:02

ASP.NET線程安全

2010-02-01 17:50:32

Python裝飾器

2010-02-01 10:04:25

Python模板函數

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 構建工具

2010-03-03 17:44:07

Python多線程

2009-08-21 11:31:59

異步和多線程的區別

2019-06-17 07:26:04

物聯網安全物聯網IOT

2017-07-21 09:40:35

Python類、繼承和多態

2011-05-27 14:18:39

2009-07-16 09:54:44

LookupEventSwing線程

2021-04-08 10:01:40

Python模塊的引入調用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲天堂中文字幕 | 精品国产乱码一区二区三区a | 91精品国产91久久久久久不卞 | 中文字幕成人 | 在线观看国产精品视频 | 国产一级视屏 | 一区二区三区四区不卡 | 男女视频在线观看免费 | 久久99精品久久久97夜夜嗨 | 色网在线看 | 亚洲国产网 | 国产精品久久久久久久久图文区 | 国产精品久久久久一区二区三区 | 亚洲性视频 | 精品国产一区二区三区成人影院 | 狠狠天天| 日本不卡一区二区三区在线观看 | 成人精品鲁一区一区二区 | 亚洲第一成年免费网站 | 国产精品毛片一区二区在线看 | 久久久成人精品 | www免费视频 | 超碰伊人 | 激情在线视频 | 国产日韩欧美在线 | 婷婷激情综合 | 激情五月综合 | 日本精品裸体写真集在线观看 | 国产精品久久亚洲7777 | 男女视频在线观看 | 欧美精品国产精品 | 国产成人免费视频网站高清观看视频 | 九九九久久国产免费 | 国产精品一区二区欧美黑人喷潮水 | 久久男女视频 | 亚洲精品一区二区 | 国产精品亚洲成在人线 | 中文字幕一区在线 | www.日本在线 | 久久久久久成人 | 亚洲一区二区三区 |