最新国产好看的视频,伊人天堂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)用對象
  • args 表示調(diào)用對象的位置參數(shù)元組
  • kwargs 表示調(diào)用對象的字典
  • 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 簡潔得多,還能自動(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)或特殊共享對象實(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)程也需防止競爭條件,通過 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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

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

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

    這篇文章給大家介紹了如何利用ctypes提高Python的執(zhí)行速度,對大家學(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è)簡單的解析模塊HTMLParser類,使用起來也是比較簡單的,解析語法沒有用到XPath類似的簡潔模式,需要的朋友可以參考下
    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ì),對大家的學(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ì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • python中numpy?常用操作總結(jié)

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

    這篇文章主要介紹了python中numpy常用操作總結(jié),NumPy是Python語言的一個(gè)擴(kuò)充程序庫,支持大量高維度數(shù)組與矩陣運(yùn)算,此外也針對數(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

最新評論

南丰县| 宜黄县| 张家界市| 维西| 陈巴尔虎旗| 郁南县| 舞钢市| 扎兰屯市| 扎兰屯市| 天津市| 诸城市| 佳木斯市| 西藏| 遵义县| 遂川县| 巴马| 闵行区| 吴忠市| 黄山市| 海兴县| 崇左市| 鲜城| 陵川县| 普陀区| 犍为县| 棋牌| 化德县| 丰台区| 南康市| 马山县| 永丰县| 邵武市| 苏州市| 蛟河市| 祁东县| 安化县| 丹阳市| 巫山县| 毕节市| 鄂州市| 顺平县|