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

淺談Python中的全局鎖(GIL)問(wèn)題

 更新時(shí)間:2019年01月11日 14:54:06   作者:xsj_blog  
今天小編就為大家分享一篇淺談Python中的全局鎖(GIL)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

CPU-bound(計(jì)算密集型) 和I/O bound(I/O密集型)

計(jì)算密集型任務(wù)(CPU-bound) 的特點(diǎn)是要進(jìn)行大量的計(jì)算,占據(jù)著主要的任務(wù),消耗CPU資源,一直處于滿負(fù)荷狀態(tài)。比如復(fù)雜的加減乘除、計(jì)算圓周率、對(duì)視頻進(jìn)行高清解碼等等,全靠CPU的運(yùn)算能力。這種計(jì)算密集型任務(wù)雖然也可以用多任務(wù)完成,但是任務(wù)越多,花在任務(wù)切換的時(shí)間就越多,CPU執(zhí)行任務(wù)的效率就越低,所以,要最高效地利用CPU,計(jì)算密集型任務(wù)同時(shí)進(jìn)行的數(shù)量應(yīng)當(dāng)?shù)扔贑PU的核心數(shù)。

計(jì)算密集型任務(wù)由于主要消耗CPU資源,因此,代碼運(yùn)行效率至關(guān)重要。Python這樣的腳本語(yǔ)言運(yùn)行效率很低,完全不適合計(jì)算密集型任務(wù)。對(duì)于計(jì)算密集型任務(wù),最好用C語(yǔ)言編寫。

IO密集型任務(wù)(I/O bound)的特點(diǎn)是指磁盤IO、網(wǎng)絡(luò)IO占主要的任務(wù),CPU消耗很少,任務(wù)的大部分時(shí)間都在等待IO操作完成(因?yàn)镮O的速度遠(yuǎn)遠(yuǎn)低于CPU和內(nèi)存的速度)。

IO密集型任務(wù)執(zhí)行期間,99%的時(shí)間都花在IO上,花在CPU上的時(shí)間很少,因此,用運(yùn)行速度極快的C語(yǔ)言替換用Python這樣運(yùn)行速度極低的腳本語(yǔ)言,完全無(wú)法提升運(yùn)行效率。

對(duì)于IO密集型任務(wù),任務(wù)越多,CPU效率越高,但也有一個(gè)限度。常見(jiàn)的大部分任務(wù)都是IO密集型任務(wù),比如請(qǐng)求網(wǎng)頁(yè)、讀寫文件等。當(dāng)然我們?cè)赑ython中可以利用sleep達(dá)到IO密集型任務(wù)的目的。

對(duì)于IO密集型任務(wù),最合適的語(yǔ)言就是開(kāi)發(fā)效率最高(代碼量最少)的語(yǔ)言,腳本語(yǔ)言是首選,C語(yǔ)言最差。

全局鎖問(wèn)題:

解釋器被一個(gè)全局解釋器鎖保護(hù)著,它確保任何時(shí)候都只有一個(gè)Python線程執(zhí)行。

GIL最大的問(wèn)題就是Python的多線程程序并不能利用多核CPU的優(yōu)勢(shì) (比如一個(gè)使用了多個(gè)線程的計(jì)算密集型程序只會(huì)在一個(gè)單CPU上面運(yùn)行)。

GIL只會(huì)影響到那些嚴(yán)重依賴CPU的程序(比如計(jì)算型的)

如果你的程序大部分只會(huì)設(shè)計(jì)到I/O,比如網(wǎng)絡(luò)交互,那么使用多線程就很合適, 因?yàn)樗鼈兇蟛糠謺r(shí)間都在等待。實(shí)際上,你完全可以放心的創(chuàng)建幾千個(gè)Python線程, 現(xiàn)代操作系統(tǒng)運(yùn)行這么多線程沒(méi)有任何壓力,沒(méi)啥可擔(dān)心的。

解決方案:

首先,如果你完全工作于Python環(huán)境中,你可以使用 multiprocessing 模塊來(lái)創(chuàng)建一個(gè)進(jìn)程池, 并像協(xié)同處理器一樣的使用它。

pool = None

# Performs a large calculation (CPU bound)
def some_work(args):
 ...
 return result

def some_thread():
 while True:
  ...
  r = pool.apply(some_work, (args))
  ...

# Initiaze the pool
if __name__ == '__main__':
 import multiprocessing
 pool = multiprocessing.Pool()

另外一個(gè)解決GIL的策略是使用C擴(kuò)展編程技術(shù)。 主要思想是將計(jì)算密集型任務(wù)轉(zhuǎn)移給C,跟Python獨(dú)立,在工作的時(shí)候在C代碼中釋放GIL。

以上這篇淺談Python中的全局鎖(GIL)問(wèn)題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 舉例講解Python編程中對(duì)線程鎖的使用

    舉例講解Python編程中對(duì)線程鎖的使用

    Python的threading模塊中提供了多種鎖的相關(guān)方法,Python的多線程不能同時(shí)執(zhí)行,因而鎖的使用非常關(guān)鍵,下面我們就來(lái)舉例講解Python編程中對(duì)線程鎖的使用:
    2016-07-07
  • python區(qū)分不同數(shù)據(jù)類型的方法

    python區(qū)分不同數(shù)據(jù)類型的方法

    這篇文章主要介紹了python區(qū)分不同數(shù)據(jù)類型的方法實(shí)例以及相關(guān)知識(shí)點(diǎn),需要的朋友們學(xué)習(xí)下。
    2019-10-10
  • python中的class_static的@classmethod的巧妙用法

    python中的class_static的@classmethod的巧妙用法

    python中的class_static的@classmethod的使用 classmethod的使用,主要針對(duì)的是類而不是對(duì)象,在定義類的時(shí)候往往會(huì)定義一些靜態(tài)的私有屬性,今天通過(guò)示例代碼看下classmethod的妙用
    2021-06-06
  • 基于PyQt5制作一個(gè)數(shù)據(jù)圖表生成器

    基于PyQt5制作一個(gè)數(shù)據(jù)圖表生成器

    這篇文章主要介紹了如何利用PyQT5制作一個(gè)數(shù)據(jù)圖表生成器,可以通過(guò)Pyecharts模塊生成可視化的html數(shù)據(jù)圖表,感興趣的小伙伴可以跟隨小編學(xué)習(xí)一下
    2022-02-02
  • Pycharm-community-2020.2.3 社區(qū)版安裝教程圖文詳解

    Pycharm-community-2020.2.3 社區(qū)版安裝教程圖文詳解

    這篇文章主要介紹了Pycharm-community-2020.2.3 社區(qū)版安裝教程圖文詳解,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 如何使用pandas對(duì)超大csv文件進(jìn)行快速拆分詳解

    如何使用pandas對(duì)超大csv文件進(jìn)行快速拆分詳解

    Pandas是Python語(yǔ)言的一個(gè)擴(kuò)展程序庫(kù),提供高性能、易于使用的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)分析工具,下面這篇文章主要給大家介紹了關(guān)于如何使用pandas對(duì)超大csv文件進(jìn)行快速拆分的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • python文件目錄操作之os模塊

    python文件目錄操作之os模塊

    這篇文章主要介紹了python文件目錄操作之os模塊,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • Python Django框架實(shí)現(xiàn)應(yīng)用添加logging日志操作示例

    Python Django框架實(shí)現(xiàn)應(yīng)用添加logging日志操作示例

    這篇文章主要介紹了Python Django框架實(shí)現(xiàn)應(yīng)用添加logging日志操作,結(jié)合實(shí)例形式分析了Django框架中添加Python內(nèi)建日志模塊相關(guān)操作技巧,需要的朋友可以參考下
    2019-05-05
  • django使用JWT保存用戶登錄信息

    django使用JWT保存用戶登錄信息

    這篇文章主要介紹了Django使用jwt獲取用戶信息的實(shí)現(xiàn)方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 利用Python編寫一個(gè)藏頭詩(shī)在線生成器

    利用Python編寫一個(gè)藏頭詩(shī)在線生成器

    這篇文章主要介紹了如何利用Python編寫一個(gè)藏頭詩(shī)在線生成器,文中的示例代碼講解詳細(xì),感興趣的同學(xué)可以跟隨小編一起動(dòng)手嘗試一下
    2022-04-04

最新評(píng)論