最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python多進(jìn)程開發(fā)之如何輕松突破GIL瓶頸

 更新時(shí)間:2025年06月23日 08:11:55   作者:燭陰  
這篇文章主要來和大家詳細(xì)介紹一下Python多進(jìn)程開發(fā)的相關(guān)知識(shí),看看它是如何繞過GIL全局解釋器鎖的,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

1. 為啥要用多進(jìn)程?先認(rèn)清GIL

Python多線程為何沒法加速CPU密集型任務(wù)?因?yàn)?strong>GIL(全局解釋器鎖):在主流的CPython解釋器中,無論多少線程歸根結(jié)底同時(shí)只有一個(gè)線程在執(zhí)行Python字節(jié)碼,嚴(yán)重影響CPU計(jì)算性能的并行。

多進(jìn)程機(jī)制完美繞開了GIL:每個(gè)進(jìn)程擁有自己的Python解釋器和內(nèi)存空間,真正多核、多CPU并行執(zhí)行,CPU密集型任務(wù)大大提速!

2. Python多進(jìn)程基礎(chǔ)用法:multiprocessing庫

Python 內(nèi)置標(biāo)準(zhǔn)庫 multiprocessing,API與threading非常類似,上手容易。

2.1 Proces介紹

Process([group [, target [, name [, args [, kwargs]]]]])

  • target 表示調(diào)用對(duì)象
  • args 表示調(diào)用對(duì)象的位置參數(shù)元組
  • kwargs 表示調(diào)用對(duì)象的字典
  • name 為別名
  • group 實(shí)質(zhì)上不使用

2.2 Hello,多進(jìn)程

from multiprocessing import Process
import os

def worker():
    print('子進(jìn)程PID:', os.getpid())

if __name__ == '__main__':
    p = Process(target=worker)
    p.start()
    p.join()
    print('主進(jìn)程結(jié)束')

注意! Windows下多進(jìn)程要寫在 if __name__ == '__main__': 保護(hù)塊內(nèi),否則會(huì)無限遞歸啟動(dòng)進(jìn)程。

2.3 多進(jìn)程并行計(jì)算

from multiprocessing import Process
import time

def task(name):
    print(f'{name} 開始')
    time.sleep(2)
    print(f'{name} 結(jié)束')

if __name__ == '__main__':
    proc_list = []
    for i in range(3):
        p = Process(target=task, args=(f'進(jìn)程{i+1}',))
        p.start()
        proc_list.append(p)
    for p in proc_list:
        p.join()
    print('所有子進(jìn)程結(jié)束')

多個(gè)進(jìn)程可并發(fā)分擔(dān)任務(wù),真正多核利用!

2.4 子進(jìn)程類實(shí)現(xiàn)(面向?qū)ο螅?/h3>
import multiprocessing
import time

class ClockProcess(multiprocessing.Process):
    def __init__(self, interval):
        multiprocessing.Process.__init__(self)
        self.interval = interval

    def run(self):
        n = 5
        while n > 0:
            print("當(dāng)前時(shí)間: {0}".format(time.ctime()))
            time.sleep(self.interval)
            n -= 1


if __name__ == '__main__':
    p = ClockProcess(3)
    p.start()

3. 進(jìn)階:進(jìn)程池批量并行(Process Pool)

大量任務(wù)并發(fā)時(shí),手動(dòng)管理進(jìn)程很麻煩,用Pool池自動(dòng)分配和收集結(jié)果,極大提升效率!

from multiprocessing import Pool
import os, time

def square(n):
    print('計(jì)算', n, '在進(jìn)程', os.getpid())
    time.sleep(1)
    return n * n

if __name__ == '__main__':
    with Pool(processes=3) as pool:
        results = pool.map(square, range(5))
    print('返回結(jié)果:', results)

比循環(huán)創(chuàng)建 Process 簡(jiǎn)潔得多,還能自動(dòng)分配CPU,每個(gè)子進(jìn)程并發(fā)執(zhí)行給定任務(wù)。

4. 多進(jìn)程間數(shù)據(jù):通信與共享

  • 每個(gè)進(jìn)程獨(dú)立內(nèi)存,不能像多線程那樣直接共享變量
  • 多進(jìn)程用隊(duì)列(Queue)、管道(Pipe)或特殊共享對(duì)象實(shí)現(xiàn)

4.1 用隊(duì)列 Queue 通信(推薦)

from multiprocessing import Process, Queue

def producer(q):
    for i in range(5):
        q.put(i)
    q.put(None)  # 發(fā)送結(jié)束標(biāo)記

def consumer(q):
    while True:
        item = q.get()
        if item is None:
            break
        print('消費(fèi):', item)

if __name__ == '__main__':
    q = Queue()
    p1 = Process(target=producer, args=(q,))
    p2 = Process(target=consumer, args=(q,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

4.2 共享內(nèi)存變量:Value 與 Array

from multiprocessing import Process, Value, Array

def worker(val, arr):
    val.value += 10
    for i in range(len(arr)):
        arr[i] *= 2

if __name__ == '__main__':
    num = Value('i', 5)                # int類型共享變量
    arr = Array('i', [1, 2, 3, 4])     # 數(shù)組
    p = Process(target=worker, args=(num, arr))
    p.start()
    p.join()
    print('num =', num.value)
    print('arr =', list(arr))

5. 多進(jìn)程安全:鎖機(jī)制

多進(jìn)程也需防止競(jìng)爭(zhēng)條件,通過 Lock/Manager 加鎖同步。

from multiprocessing import Process, Lock, Value

def add(lock, counter):
    for _ in range(100000):
        with lock:
            counter.value += 1

if __name__ == '__main__':
    lock = Lock()
    counter = Value('i', 0)
    procs = [Process(target=add, args=(lock, counter)) for _ in range(4)]
    for p in procs:
        p.start()
    for p in procs:
        p.join()
    print('結(jié)果:', counter.value)

6. 多進(jìn)程vs多線程,該如何選?

  • CPU密集(數(shù)值計(jì)算/圖像處理/大數(shù)據(jù)科學(xué)):用多進(jìn)程“跑滿CPU”突破GIL
  • IO密集(爬蟲/網(wǎng)絡(luò)/磁盤/數(shù)據(jù)庫交互):多線程即可,更省內(nèi)存和切換開銷

到此這篇關(guān)于Python多進(jìn)程開發(fā)之如何輕松突破GIL瓶頸的文章就介紹到這了,更多相關(guān)Python GIL內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 用Python爬取英雄聯(lián)盟的皮膚詳細(xì)示例

    用Python爬取英雄聯(lián)盟的皮膚詳細(xì)示例

    大家好,本篇文章主要講的是用Python爬取英雄聯(lián)盟的皮膚詳細(xì)示例,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 利用ctypes提高Python的執(zhí)行速度

    利用ctypes提高Python的執(zhí)行速度

    這篇文章給大家介紹了如何利用ctypes提高Python的執(zhí)行速度,對(duì)大家學(xué)習(xí)使用python具有一定的參考借鑒價(jià)值。有需要的朋友們一起來看看吧。
    2016-09-09
  • Python 網(wǎng)頁解析HTMLParse的實(shí)例詳解

    Python 網(wǎng)頁解析HTMLParse的實(shí)例詳解

    這篇文章主要介紹了Python 網(wǎng)頁解析HTMLParse的實(shí)例詳解的相關(guān)資料,python里提供了一個(gè)簡(jiǎn)單的解析模塊HTMLParser類,使用起來也是比較簡(jiǎn)單的,解析語法沒有用到XPath類似的簡(jiǎn)潔模式,需要的朋友可以參考下
    2017-08-08
  • PyQt5通過信號(hào)實(shí)現(xiàn)MVC的示例

    PyQt5通過信號(hào)實(shí)現(xiàn)MVC的示例

    這篇文章主要介紹了PyQt5通過信號(hào)實(shí)現(xiàn)MVC的示例,幫助大家更好的理解和使用pyqt5,感興趣的朋友可以了解下
    2021-02-02
  • Python3基于print打印帶顏色字符串

    Python3基于print打印帶顏色字符串

    這篇文章主要介紹了Python3使基于print打印帶顏色字符串,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 王純業(yè)的Python學(xué)習(xí)筆記 下載

    王純業(yè)的Python學(xué)習(xí)筆記 下載

    這篇文章主要介紹了王純業(yè)的Python學(xué)習(xí)筆記 下載
    2007-02-02
  • Python編程中歸并排序算法的實(shí)現(xiàn)步驟詳解

    Python編程中歸并排序算法的實(shí)現(xiàn)步驟詳解

    這篇文章主要介紹了Python編程中歸并排序算法的實(shí)現(xiàn)步驟詳解,歸并排序的平均時(shí)間復(fù)雜度為(n\log n),需要的朋友可以參考下
    2016-05-05
  • python如何讀取bin文件并下發(fā)串口

    python如何讀取bin文件并下發(fā)串口

    這篇文章主要介紹了python如何讀取bin文件并下發(fā)串口,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • python中numpy?常用操作總結(jié)

    python中numpy?常用操作總結(jié)

    這篇文章主要介紹了python中numpy常用操作總結(jié),NumPy是Python語言的一個(gè)擴(kuò)充程序庫,支持大量高維度數(shù)組與矩陣運(yùn)算,此外也針對(duì)數(shù)組運(yùn)算提供大量的數(shù)學(xué)函數(shù)庫
    2022-09-09
  • 使用python裝飾器驗(yàn)證配置文件示例

    使用python裝飾器驗(yàn)證配置文件示例

    項(xiàng)目中用到了一個(gè)WriteData的函數(shù)保存用戶填寫的配置,為了實(shí)現(xiàn)驗(yàn)證用戶輸入的需求,在不影響接口的使用的前提下,采用了python的裝飾器實(shí)現(xiàn),代碼片段演示了如何驗(yàn)證WriteData函數(shù)的輸入?yún)?shù)
    2014-02-02

最新評(píng)論

仙居县| 汉阴县| 资兴市| 临潭县| 高雄县| 大连市| 江山市| 徐州市| 连江县| 衡水市| 巨野县| 西平县| 张家界市| 湘潭市| 平舆县| 车致| 临洮县| 镇原县| 牟定县| 富川| 渭源县| 凤山县| 定南县| 永宁县| 马关县| 虎林市| 天气| 巴南区| 大田县| 墨玉县| 额济纳旗| 临桂县| 巩留县| 乌鲁木齐市| 湖州市| 中卫市| 唐山市| 阳新县| 邵东县| 冷水江市| 自贡市|