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

一文理解Python的全局解釋器鎖(GIL)

開發(fā) 前端
GIL是Python解釋器中的一個(gè)互斥鎖,它確保在同一時(shí)刻只有一個(gè)線程能夠執(zhí)行Python字節(jié)碼。這意味著在多線程環(huán)境下,Python解釋器無法同時(shí)利用多個(gè)CPU核心進(jìn)行并行執(zhí)行,因?yàn)橹挥幸粋€(gè)線程能夠執(zhí)行Python字節(jié)碼指令。

前言

? 在Python中,全局解釋器鎖(Global Interpreter Lock,簡稱GIL)是一個(gè)重要的概念,它對(duì)Python解釋器的并發(fā)執(zhí)行模型產(chǎn)生了重大影響。本文將介紹GIL的概念、原理以及對(duì)Python多線程程序執(zhí)行效率的影響,并附帶詳細(xì)的代碼案例進(jìn)行說明。

什么是 GIL

? GIL是Python解釋器中的一個(gè)互斥鎖,它確保在同一時(shí)刻只有一個(gè)線程能夠執(zhí)行Python字節(jié)碼。這意味著在多線程環(huán)境下,Python解釋器無法同時(shí)利用多個(gè)CPU核心進(jìn)行并行執(zhí)行,因?yàn)橹挥幸粋€(gè)線程能夠執(zhí)行Python字節(jié)碼指令。

GIL 的工作原理

? 當(dāng)Python解釋器運(yùn)行Python代碼時(shí),它會(huì)獲取GIL,然后執(zhí)行相應(yīng)的字節(jié)碼指令。其他線程想要執(zhí)行Python字節(jié)碼時(shí),必須先獲取GIL,但只有在當(dāng)前線程釋放GIL后才能獲得。因此,只有一個(gè)線程能夠在任意時(shí)刻執(zhí)行Python字節(jié)碼,這就是GIL的工作原理。

GIL 的影響

多線程

? 盡管Python完全支持多線程編程, 但是解釋器的C語言實(shí)現(xiàn)部分在完全并行執(zhí)行時(shí)并不是線程安全的。 實(shí)際上,解釋器被一個(gè)全局解釋器鎖保護(hù)著,它確保任何時(shí)候都只有一個(gè)Python線程執(zhí)行。 GIL最大的問題就是Python的多線程程序并不能利用多核CPU的優(yōu)勢(shì) (比如一個(gè)使用了多個(gè)線程的計(jì)算密集型程序只會(huì)在一個(gè)單CPU上面運(yùn)行)。

? 有一點(diǎn)要強(qiáng)調(diào)的是GIL只會(huì)影響到那些嚴(yán)重依賴CPU的程序(比如計(jì)算型的)。 如果你的程序大部分只會(huì)涉及到I/O,比如網(wǎng)絡(luò)交互,那么使用多線程就很合適, 因?yàn)樗鼈兇蟛糠謺r(shí)間都在等待。

? 對(duì)于依賴CPU的程序,你需要弄清楚執(zhí)行的計(jì)算的特點(diǎn)。 例如,優(yōu)化底層算法可能要比使用多線程運(yùn)行快得多。 類似的,由于Python是解釋執(zhí)行的,如果你將那些性能瓶頸代碼移到一個(gè)C語言擴(kuò)展模塊中, 速度也會(huì)提升的很快。如果你要操作數(shù)組,那么使用NumPy這樣的擴(kuò)展會(huì)非常的高效。 最后,你還可以考慮下其他可選實(shí)現(xiàn)方案,比如PyPy,它通過一個(gè)JIT編譯器來優(yōu)化執(zhí)行效率。

多進(jìn)程

? 在 Python 中,GIL(全局解釋器鎖)只影響到了多線程,而不會(huì)對(duì)多進(jìn)程產(chǎn)生直接的影響。多進(jìn)程是通過創(chuàng)建不同的 Python 解釋器來實(shí)現(xiàn)的,因此每個(gè)進(jìn)程都有自己的獨(dú)立 GIL,它們之間互不影響。

如何解決 GIL 的缺點(diǎn)

示例代碼

? 代碼版本 Python 3.x

? 如我們?nèi)绾蝺?yōu)化下列代碼:

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

# A thread that calls the above function
def some_thread():
    while True:
        ...
        r = some_work(args)
    ...

使用多進(jìn)程的方式

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

# Processing pool (see below for initiazation)
pool = None

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

# A thread that calls the above function
def some_thread():
    while True:
        ...
        r = pool.apply(some_work, (args))
        ...

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

使用C擴(kuò)展編程技術(shù)

? 主要思想是將計(jì)算密集型任務(wù)轉(zhuǎn)移給C,跟Python獨(dú)立,在工作的時(shí)候在C代碼中釋放GIL。 可以通過在C代碼中插入下面這樣的特殊宏來完成:

#include "Python.h"
...

PyObject *pyfunc(PyObject *self, PyObject *args) {
   ...
   Py_BEGIN_ALLOW_THREADS
   // Threaded C code
   ...
   Py_END_ALLOW_THREADS
   ...
}

? 如果使用其他工具訪問C語言,比如對(duì)于Cython的ctypes庫,你不需要做任何事。 例如,ctypes在調(diào)用C時(shí)會(huì)自動(dòng)釋放GIL。

參考

12.9 Python的全局鎖問題

責(zé)任編輯:武曉燕 來源: Lorin 洛林
相關(guān)推薦

2023-12-28 07:37:24

CAS內(nèi)存阻塞

2022-05-18 09:42:29

PythonGILGross

2022-09-01 08:01:56

Pythongunicorn

2020-11-03 11:04:20

Linux 工具 開發(fā)

2023-03-30 09:53:57

2021-06-28 10:03:44

分布式數(shù)據(jù)庫架構(gòu)

2022-07-13 09:53:58

分布式開發(fā)

2023-07-31 11:22:29

編程開發(fā)

2021-11-29 13:13:57

網(wǎng)絡(luò)虛擬化容器

2018-06-13 08:33:32

車聯(lián)網(wǎng)智能交通互聯(lián)網(wǎng)

2019-11-07 15:07:30

微服務(wù)模式反模式

2025-03-03 08:40:00

JavaScriptthis開發(fā)

2018-05-31 20:49:50

Spark堆內(nèi)內(nèi)存優(yōu)化機(jī)制

2022-09-21 09:04:07

Python裝飾器

2024-07-11 12:14:20

Pythonmapfilter

2019-11-06 17:00:51

深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)人工智能

2019-10-11 08:41:35

JVM虛擬機(jī)語言

2020-10-20 13:50:47

MySQL數(shù)據(jù)庫

2022-08-18 09:00:00

自動(dòng)駕駛合成控制邁阿密

2019-12-18 15:13:33

JVM虛擬機(jī)內(nèi)存
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 成人av资源在线 | 二区精品 | 国产精品国产a | 丝袜毛片 | 久久新| 狠狠综合久久av一区二区小说 | 黄色片a级 | 日韩色在线 | 亚洲精久 | 中国美女一级黄色片 | 亚洲一级av毛片 | 天天操天天射天天 | 亚洲第1页| av在线伊人 | 欧美韩一区二区三区 | 一区在线观看 | 精品一区二区三区在线观看 | 精品国产乱码久久久久久久久 | 国产亚洲精品a | 亚洲电影第三页 | 亚洲九色 | 视频一区二区在线 | 久久久久免费观看 | 国产丝袜一区二区三区免费视频 | 久久99久久 | 国内精品免费久久久久软件老师 | 蜜臀av日日欢夜夜爽一区 | 亚洲国产日韩欧美 | 81精品国产乱码久久久久久 | 97国产一区二区 | 国产精品久久久久久影视 | 亚洲精品美女视频 | 91久久久久| 国产乡下妇女做爰 | 国产精品久久久久久吹潮 | 国产精品无码久久久久 | 日韩福利 | 精品久久久久久亚洲国产800 | 亚洲免费网 | 免费视频二区 | 成人一区二区在线 |