丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號(hào)安全和更好的產(chǎn)品體驗(yàn),強(qiáng)烈建議使用更快更安全的瀏覽器
此為臨時(shí)鏈接,僅用于文章預(yù)覽,將在時(shí)失效
人工智能 正文
發(fā)私信給叢末
發(fā)送

1

尹立博:Python 全局解釋器鎖與并發(fā) | AI 研習(xí)社第 59 期猿桌會(huì)

本文作者: 叢末 2018-12-01 14:02
導(dǎo)語:關(guān)于 Python 全局解釋器鎖與并發(fā)問題的一筐干貨~

雷鋒網(wǎng) AI 科技評(píng)論按:作為排名靠前的最受歡迎和增長(zhǎng)最快的編程語言之一,Python 是一種多用途、高級(jí)別、面向?qū)ο蟆⒔换ナ?、解釋型和?duì)用戶非常友好的編程語言,擁有卓越的可讀性和極高的自由度。而為了能利用多核多線程的的優(yōu)勢(shì),同時(shí)又要保證線程之間數(shù)據(jù)完整性和狀態(tài)同步,Python 官方的、最廣泛使用的解釋器——CPython 往往會(huì)采取最簡(jiǎn)單的加鎖的方式——全局解釋器鎖(GIL)。

然而,GIL 的設(shè)計(jì)有時(shí)會(huì)顯得笨拙低效,并對(duì)語言的并發(fā)性帶來嚴(yán)重限制,但是此時(shí)由于內(nèi)置庫和第三方庫已經(jīng)對(duì) GIL 形成了巨大的依賴,想改變 GIL 反而變得困難了。不過實(shí)際上,Python 生態(tài)系統(tǒng)中存在諸多工具可以解決這一問題。

近日,在雷鋒網(wǎng) AI 研習(xí)社公開課上,畢業(yè)于澳大利亞國(guó)立大學(xué)的尹立博介紹了全局解釋器鎖(GIL)和提升并發(fā)性的不同思路。公開課回放視頻網(wǎng)址:http://www.mooc.ai/open/course/569?=aitechtalkyinlibo

尹立博:畢業(yè)于西澳大利亞大學(xué)和澳大利亞國(guó)立大學(xué)?,F(xiàn)在堪培拉 Seeing Machines 公司擔(dān)任數(shù)據(jù)分析師,日常使用 Python 數(shù)據(jù)工具對(duì)大量時(shí)序數(shù)據(jù)進(jìn)行管理、分析與可視化開發(fā)。

分享主題:Python 全局解釋器鎖與并發(fā)

分享提綱:

1、全局解釋器鎖 (GIL)

2、多進(jìn)程 (multiprocessing)

3、多線程 (multithreading)

4、異步 (async)

5、分布式計(jì)算(以 Dask 為例)

雷鋒網(wǎng) AI 研習(xí)社將其分享內(nèi)容整理如下:

今天要跟大家分享的是 Python 全局解釋器鎖與并發(fā)。我會(huì)先介紹一下全局解釋器鎖 (GIL))的概念和影響;接下來會(huì)借助幾個(gè)案例分析來展示 Python 通過多進(jìn)程、多線程和異步、分布式計(jì)算來達(dá)成并發(fā)的幾種方式;最后會(huì)介紹一套分布式計(jì)算工具——Dask。

全局解釋器鎖 (GIL)

GIL 的概念用簡(jiǎn)單的一句話來解釋,就是「任一時(shí)刻,無論線程多少,單一 CPython 解釋器只能執(zhí)行一條字節(jié)碼」。這個(gè)定義需要注意的點(diǎn)包括:

第一,GIL 不屬于 Python 語言定義,而是 CPython 解釋器實(shí)現(xiàn)的一部分;

第二,其他 Python 解釋器不一定有 GIL。例如 Jython (JVM) 和 IronPython (CLR) 沒有 GIL,而 PyPy 有 GIL;

第三,GIL 并不是 Python 的專利。其他語言也有 GIL,尤其是動(dòng)態(tài)語言,如 Ruby MRI。

說到 GIL,就不得不提 Python 線程模型,它的運(yùn)行方式如下:

  • CPython 使用 OS 原生線程,由 OS 負(fù)責(zé)調(diào)度;

  • 每個(gè)解釋器進(jìn)程有唯一的主線程和用戶定義的任意數(shù)量子線程;

  • GIL 是字節(jié)碼層面上的互斥鎖。剛剛定義中提到的 PyThread_type_lock 就是 OS 互斥鎖的別名

  • 每個(gè)解釋器進(jìn)程有且僅有一把鎖;

  • 當(dāng)解釋器啟動(dòng)時(shí),主線程即獲取 GIL;

  • 一個(gè)線程持有 GIL 并執(zhí)行字節(jié)碼時(shí),其他線程處于阻塞狀態(tài)。

GIL 被加到 CPython 解釋器中,是有其原因的。在 1992 年,單 CPU 是合理的假設(shè)!多核則是 2005-2006 年前后才普及,此外,GIL 的優(yōu)勢(shì)還包括:

  • 簡(jiǎn)化解釋器實(shí)現(xiàn);

  • 優(yōu)化單進(jìn)程性能;

  • 簡(jiǎn)化 C 擴(kuò)展庫的整合。

Python 有兩種多任務(wù)模型:一種叫做協(xié)作式 (cooperative) 多任務(wù);另一種叫搶占式 (preemptive) 多任務(wù)。

協(xié)作式多任務(wù):

  • 在 I/O 前主動(dòng)釋放 GIL,I/O 之后重新獲取。這可以在 C 源代碼中使用 Py_BEGIN_ALLOW_THREADS / Py_END_ALLOW_THREADS 宏實(shí)現(xiàn)

  • 這種多任務(wù)方式能夠提升代碼性能!

搶占式多任務(wù):

  • 間歇性掛起活躍進(jìn)程,交由 OS 重新調(diào)度

  • Python 2:每執(zhí)行 100 個(gè)字節(jié)碼,當(dāng)前進(jìn)程就會(huì)被掛起

  • Python 3.2+: 每隔 5 毫秒

  • 這種多任務(wù)方式不提高代碼性能,但使得多個(gè)任務(wù)能在同一時(shí)間段內(nèi)執(zhí)行

接下來可以進(jìn)展到去除 GIL。這是很多 Python 用戶十分期待的事情,但是短期內(nèi)是不太可能實(shí)現(xiàn)的,它的難點(diǎn)包括:

第一,技術(shù)問題

  • Guido 要求不降低單線程執(zhí)行效率

  • 兼容現(xiàn)有引用計(jì)數(shù)與垃圾回收機(jī)制

  • 兼容現(xiàn)有 C 擴(kuò)展

第二,在社區(qū)友好性上,不顯著提高開發(fā)難度。

盡管如此,我們也可以看到一些現(xiàn)有去除 GIL 的實(shí)驗(yàn)性的方案:

  • Gilectomy:嘗試將 GIL 換成若干小鎖,然而這種方案嚴(yán)重降低了 Python 的性能。首先,它會(huì)使得多線程競(jìng)爭(zhēng)同一把鎖。其次,它在將 GIL 換成若干小鎖后,將嚴(yán)重降低緩存的命中率。

  • PyPy:實(shí)驗(yàn)性分支支持軟件事務(wù)內(nèi)存 (STM),不過 STM 目前還是一個(gè)相對(duì)少見的機(jī)制,可解決當(dāng)前很多問題,但是實(shí)現(xiàn)非常困難——尤其在像 Python 這種高度動(dòng)態(tài)的語言當(dāng)中。

  • Starlark:這種方案并非去掉 GIL,而是一門兼容部分 Python 語法,并發(fā)執(zhí)行字節(jié)碼的新語言。它目前用于 Google Bazel 編譯系統(tǒng),我個(gè)人認(rèn)為這是一個(gè)非常有意思的未來趨勢(shì)。

既然現(xiàn)在去除 GIL 的方案都有很多弊端,并且短期內(nèi)我們也無法讓 GIL 從 Python 中被去除,我們最常見的解決方案就是避開 GIL,主要通過兩種手段實(shí)現(xiàn):

第一種是多解釋器進(jìn)程并發(fā) (multiprocessing)

第二種是避免執(zhí)行 Python 字節(jié)碼,常見的方法有:Cython ctypes、部分 NumPy 函數(shù)釋放 GIL、Numba JIT「nogil=True」,以及 TensorFlow/PyTorch JIT。

多進(jìn)程(multiprocessing)和多線程(multithreading)

進(jìn)入案例分析前,先介紹幾個(gè)相關(guān)的概念。

首先介紹一下并行與并發(fā)的區(qū)別:

  • 并發(fā)(concurrency):是指多個(gè)操作可以在重疊的時(shí)間段內(nèi)進(jìn)行,例如在第一個(gè)時(shí)間片內(nèi),線程 A 執(zhí)行,線程 B 阻塞;第二個(gè)時(shí)間片內(nèi),線程 B 等待 I/O,而線程 A 執(zhí)行;第三個(gè)時(shí)間片內(nèi),線程 A 執(zhí)行,而線程 B 還在等待 I/O。

  • 并行(parallelism):是指多個(gè)操作在同一時(shí)間點(diǎn)上進(jìn)行。無論在哪個(gè)時(shí)間片里,兩個(gè)線程可能同時(shí)處于某一狀態(tài)。例如在第一個(gè)時(shí)間片內(nèi),線程 A 執(zhí)行,線程 B 執(zhí)行;第二個(gè)時(shí)間片內(nèi),線程 A 等待 I/O,線程 B 也在等待 I/O ;第三個(gè)時(shí)間片內(nèi),線程 A 執(zhí)行,而線程 B 也 執(zhí)行。

多線程意味著我們?cè)谑褂貌l(fā)這種線程模型,而多進(jìn)程則是在使用并行這一線程模型,其各有利弊:

  • 多線程并發(fā)的優(yōu)勢(shì)為:可共享內(nèi)存空間,方便交換數(shù)據(jù);劣勢(shì)為:會(huì)同時(shí)寫入內(nèi)存將導(dǎo)致數(shù)據(jù)損壞。

  • 多進(jìn)程并行的優(yōu)勢(shì)為:內(nèi)存空間獨(dú)立(恰來自其劣勢(shì));劣勢(shì)為:進(jìn)程間交互需要序列化-通信-反序列化。

接下來我們將通過一個(gè)案例來嘗試 Python 并發(fā)的幾種不同解決方案的案例:

尹立博:Python 全局解釋器鎖與并發(fā) | AI 研習(xí)社第 59 期猿桌會(huì)

(關(guān)于嘗試 Python 并發(fā)的幾種不同解決方案的案例講解,請(qǐng)回看視頻 00:19:05 處,http://www.mooc.ai/open/course/569?=aitechtalkyinlibo

這就講到多進(jìn)程(multiprocessing)這一概念,它的適用場(chǎng)景包括:

  • CPU 占用率高

  • 子進(jìn)程間通信簡(jiǎn)單

  • 相關(guān)變量和函數(shù)可被序列化,但占用內(nèi)存較小

如果想知道更多內(nèi)容,大家可參見文檔:

https://docs.python.org/3/library/multiprocessing.html

https://docs.python.org/3/library/concurrent.futures.html

接下來進(jìn)入到多進(jìn)程解決方案的案例講解:

尹立博:Python 全局解釋器鎖與并發(fā) | AI 研習(xí)社第 59 期猿桌會(huì)

(關(guān)于多進(jìn)程解決方案的案例講解,請(qǐng)回看視頻 00:23:25 處,http://www.mooc.ai/open/course/569?=aitechtalkyinlibo

之后要講到多線程 (multithreading),多線程的使用場(chǎng)景包括:

  • CPU 占用率低

  • I/O 負(fù)載高

  • 子任務(wù)需要共享內(nèi)存

如要了解更多內(nèi)容,可以參見文檔:

https://docs.python.org/3/library/threading.html

https://docs.python.org/3/library/queue.html

尹立博:Python 全局解釋器鎖與并發(fā) | AI 研習(xí)社第 59 期猿桌會(huì)

(關(guān)于多線程解決方案的案例講解,請(qǐng)回看視頻 00:33:25 處,http://www.mooc.ai/open/course/569?=aitechtalkyinlibo

再看一下 Python 多線程編程難點(diǎn),下面這些難點(diǎn)有些針對(duì) Python,有些是所有多線程共通的難題:

第一,CPython 的線程切換可能在任意字節(jié)碼之間發(fā)生,而 Python 指令不具有原子性

第二,每次訪問受限資源都需獲取鎖

第三,鎖不具有強(qiáng)制性,即使忘記獲取鎖,代碼也可能運(yùn)行

第四,競(jìng)爭(zhēng)狀態(tài)難以復(fù)制

我們看一個(gè)相關(guān)的案例——多線程計(jì)數(shù)器:

尹立博:Python 全局解釋器鎖與并發(fā) | AI 研習(xí)社第 59 期猿桌會(huì)

(關(guān)于多線程計(jì)數(shù)器的案例講解,請(qǐng)回看視頻 00:37:00 處,http://www.mooc.ai/open/course/569?=aitechtalkyinlibo

異步 (async)

接著講一下異步 (async)。Python 中的異步是一種在單一線程內(nèi)使用生成器實(shí)現(xiàn)的協(xié)程,比線程能更高效地組織非阻塞式任務(wù)。協(xié)程的切換由 Python 解釋器內(nèi)完成。當(dāng)然,其他語言也有異步編程,比如 Go 語言的 goroutine,以及 Nginx 用 C 實(shí)現(xiàn)了異步編程。

關(guān)于更多異步編程的內(nèi)容,大家可參見文檔:

https://docs.python.org/3/library/asyncio-task.html

看案例之前,先比較一下異步與線程。與線程相比,異步的優(yōu)劣勢(shì)分別為:

優(yōu)勢(shì):

  • 簡(jiǎn)單的多任務(wù)模型

  • 明確的協(xié)程切換點(diǎn)

  • 系統(tǒng)開銷遠(yuǎn)小于 OS 原生線程

劣勢(shì):

  • 有相對(duì)獨(dú)立的生態(tài)系統(tǒng)

  • 與其他并發(fā)模型混用較難

  • API 仍未穩(wěn)定

下面我們看異步的案例:

尹立博:Python 全局解釋器鎖與并發(fā) | AI 研習(xí)社第 59 期猿桌會(huì)

(關(guān)于異步的案例講解,請(qǐng)回看視頻 00:46:05 處,http://www.mooc.ai/open/course/569?=aitechtalkyinlibo

分布式計(jì)算(以 Dask 為例)

最后講一下分布式計(jì)算,本堂課中的分布式計(jì)算以 Dask 為例。

Dask 是一種基于運(yùn)算圖的動(dòng)態(tài)任務(wù)調(diào)度器,可使用動(dòng)態(tài)調(diào)度器擴(kuò)展 NumPy 和 Pandas。左邊這個(gè)圖就是 Dask 的運(yùn)算圖。

尹立博:Python 全局解釋器鎖與并發(fā) | AI 研習(xí)社第 59 期猿桌會(huì)

(關(guān)于 Dask 運(yùn)算圖的講解,請(qǐng)回看視頻 00:55:45 處,http://www.mooc.ai/open/course/569?=aitechtalkyinlibo

與另一種分布式計(jì)算方法 Spark 比較,Dask 的特性非常鮮明:

  • 它是一個(gè)純 Python 實(shí)現(xiàn)

  • 無需遵循 map-reduce 范式

  • 細(xì)粒調(diào)度帶來較低的延遲

在 Dask 中,我們更關(guān)注的是 Distributed。它是 Dask 在異構(gòu)集群上的擴(kuò)展。它的網(wǎng)絡(luò)結(jié)構(gòu)遵循客戶 – 調(diào)度器 – 工作節(jié)點(diǎn)這樣的形式,因此要求所有節(jié)點(diǎn)擁有相同的 Python 運(yùn)行環(huán)境。

接下來我們看一個(gè)簡(jiǎn)單的案例:

尹立博:Python 全局解釋器鎖與并發(fā) | AI 研習(xí)社第 59 期猿桌會(huì)

(關(guān)于該案例講解,請(qǐng)回看視頻 00:59:45 處,http://www.mooc.ai/open/course/569?=aitechtalkyinlibo

最后放上今天這堂課涉及到的內(nèi)容的演講,基本都能在 youtube 上進(jìn)行觀看。

Dave Beazley: Understanding the Python GIL, PyCon 2010 

https://www.youtube.com/watch?v=Obt-vMVdM8s 

https://www.dabeaz.com/python/UnderstandingGIL.pdf 

Dave Beazley: Embracing the Global Interpreter Lock (GIL), PyCodeConf 2011

https://www.youtube.com/watch?v=fwzPF2JLoeU 

Larry Hastings: Python's Infamous GIL, PyCon 2015 

https://www.youtube.com/watch?v=KVKufdTphKs 

Larry Hastings: Removing Python's GIL: The Gilectomy, PyCon 2016 

https://www.youtube.com/watch?v=P3AyI_u66Bw

A Jesse Jiryu Davis: Grok the GIL Write Fast And Thread Safe Python, PyCon 2017

https://www.youtube.com/watch?v=7SSYhuk5hmc

Raymond Hettinger: Keynote on Concurrency, PyBay 2017

https://www.youtube.com/watch?v=9zinZmE3Ogk 

https://pybay.com/site_media/slides/raymond2017-keynote/index.html 

Dave Beazley: Fear and Awaiting in Async: A Savage Journey to the Heart of the Coroutine Dream

https://www.youtube.com/watch?v=E-1Y4kSsAFc 

Robert Smallshire: Coroutine Concurrency in Python 3 with asyncio 

https://www.youtube.com/watch?v=c5wodlqGK-M ?Matthew Rocklin: Dask for ad hoc distributed computing 

https://www.youtube.com/watch?v=EEfI-11itn0 

Matthew Rocklin: Dask: A Pythonic Distributed Data Science Framework, PyCon 2017 

https://www.youtube.com/watch?v=RA_2qdipVng

以上就是本期嘉賓的全部分享內(nèi)容。更多公開課視頻請(qǐng)到雷鋒網(wǎng) AI 研習(xí)社社區(qū)(http://ai.yanxishe.com/)觀看。關(guān)注微信公眾號(hào):AI 研習(xí)社(okweiwu),可獲取最新公開課直播時(shí)間預(yù)告。

雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。

尹立博:Python 全局解釋器鎖與并發(fā) | AI 研習(xí)社第 59 期猿桌會(huì)

分享:
相關(guān)文章
當(dāng)月熱門文章
最新文章
請(qǐng)?zhí)顚懮暾?qǐng)人資料
姓名
電話
郵箱
微信號(hào)
作品鏈接
個(gè)人簡(jiǎn)介
為了您的賬戶安全,請(qǐng)驗(yàn)證郵箱
您的郵箱還未驗(yàn)證,完成可獲20積分喲!
請(qǐng)驗(yàn)證您的郵箱
立即驗(yàn)證
完善賬號(hào)信息
您的賬號(hào)已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說