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

Python使用multiprocessing實現(xiàn)多進程

 更新時間:2025年07月21日 09:35:04   作者:黑鹿022  
當我們工作中涉及到處理大量數據、并行計算或并發(fā)任務時,Python的multiprocessing模塊是一個強大而實用的工具,在本文中,我們將探索如何使用multiprocessing模塊實現(xiàn)多進程編程,將介紹進程池的概念和用法,需要的朋友可以參考下

一、進程概念

進程(Process)是資源分配的最小單位,它是操作系統(tǒng)進行資源分配和調度運行的基本單位,通俗理解:一個正在運行的程序就是一個進程。

注: 一個程序運行后至少有一個進程

二、python多進程

在python中使用多進程我們需要導入 multiprocessing 模塊

import multiprocessing

實例演示:

  • 我們先定義兩個函數,然后創(chuàng)建子進程去調用它們
import time

def mission1(n):
    for i in range(1, n + 1):
        print(f'第{i}次執(zhí)行任務一。')
        time.sleep(0.2)


def mission2(n):
    for i in range(1, n + 1):
        print(f"第{i}次執(zhí)行任務二。")
        time.sleep(0.2)

每個函數每次循環(huán)都sleep 0.2秒目的是為了之后演示進程之間是同步執(zhí)行的情況,否則程序運行太快沒辦法體現(xiàn)。

我們先試著直接調用它們:

mission1(5)
mission2(5)
"""
結果:
第1次執(zhí)行任務一。
第2次執(zhí)行任務一。
第3次執(zhí)行任務一。
第4次執(zhí)行任務一。
第5次執(zhí)行任務一。
第1次執(zhí)行任務二。
第2次執(zhí)行任務二。
第3次執(zhí)行任務二。
第4次執(zhí)行任務二。
第5次執(zhí)行任務二。
"""

結果:先執(zhí)行了mission1 再執(zhí)行了mission2

  • 子進程依賴于父進程創(chuàng)建,因而我們要創(chuàng)建兩個子進程,那么必須在父進程里面去創(chuàng)建。
    python運行文件的時候會創(chuàng)建一個主進程也就是 MainProcess,因而我們必須在main里面去操作子進程:
if __name__ == '__main__':
		pass
  • 接著我們創(chuàng)建子進程對象:
if __name__ == '__main__':
    p1 = multiprocessing.Process(target=mission1,  args=(5,))
    p2 = multiprocessing.Process(target=mission2,  kwargs={'n': 5})

multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={}) :
target—表示調用對象,即子進程要執(zhí)行的任務(回調函數入口地址)
args—表示以元組的形式向子任務函數傳參,元組方式傳參一定要和參數的順序保持一致
kwargs—表示以字典的方式給子任務函數傳參,字典方式傳參字典中的key要和參數名保持一致
name—為子進程的名稱

進程運行:

p1.start()
p2.start()
  • 完整代碼:
import multiprocessing

import time

def mission1(n):
    for i in range(1, n + 1):
        print(f'第{i}次執(zhí)行任務一。')
        time.sleep(0.2)


def mission2(n):
    for i in range(1, n + 1):
        print(f"第{i}次執(zhí)行任務二。")
        time.sleep(0.2)


if __name__ == '__main__':
    p1 = multiprocessing.Process(target=mission1,  args=(5,)) # 注意單元素的元組格式
    p2 = multiprocessing.Process(target=mission2,  kwargs={'n': 5})

    p1.start()
    p2.start()
 
"""
結果:
第1次執(zhí)行任務一。
第1次執(zhí)行任務二。
第2次執(zhí)行任務一。
第2次執(zhí)行任務二。
第3次執(zhí)行任務一。
第3次執(zhí)行任務二。
第4次執(zhí)行任務一。
第4次執(zhí)行任務二。
第5次執(zhí)行任務一。
第5次執(zhí)行任務二。
"""

結果顯示:兩個函數在兩個子進程中同時執(zhí)行。(每次執(zhí)行順序可能有略微差別)

獲取進程信息

current_process()

獲取當前進程的信息:name(進程名稱) 和 pid (進程ID)

def mission1(user, n):
    print(f"mission-1子進程:{multiprocessing.current_process().name}")
    print(f"mission-1子進程ID:{multiprocessing.current_process().pid}")
    for i in range(1, n + 1):
        print(f"用戶{user}正在第{i}次執(zhí)行任務一。")
        time.sleep(0.2)

OS 模塊

可以使用os模塊中的getpid()獲取當前進程的ID 以及 getppid()獲取當前進程的父進程ID。

import os
def mission2(user, n):
    print(f"mission-2子進程:{multiprocessing.current_process().name}")
    print(f"mission-2子進程ID:{os.getpid()}")
    print(f"mission-2子進程的父進程為:{os.getppid()}")
    for i in range(1, n + 1):
        print(f"用戶{user}正在第{i}次執(zhí)行任務二。")
        time.sleep(0.2)

完整代碼:

import multiprocessing
import time
import os


def mission1(user, n):
    print(f"mission-1子進程:{multiprocessing.current_process().name}")
    print(f"mission-1子進程ID:{multiprocessing.current_process().pid}")
    print(f"mission-1子進程的父進程為:{os.getppid()}")
    for i in range(1, n + 1):
        print(f"用戶{user}正在第{i}次執(zhí)行任務一。")
        time.sleep(0.2)


def mission2(user, n):
    print(f"mission-2子進程:{multiprocessing.current_process().name}")
    print(f"mission-2子進程ID:{os.getpid()}")
    print(f"mission-2子進程的父進程為:{os.getppid()}")
    for i in range(1, n + 1):
        print(f"用戶{user}正在第{i}次執(zhí)行任務二。")
        time.sleep(0.2)

if __name__ == '__main__':
    print(f"主進程的ID為:{multiprocessing.current_process().pid}")
    print(f"主進程的父進程ID為:{os.getppid()}")
    print(f'--------主進程{multiprocessing.current_process().name}開始執(zhí)行--------')

    p1=multiprocessing.Process(target=mission1,name='mission-1',args=('張三',5))
    p2=multiprocessing.Process(target=mission2,name='mission-2',args=('李四',5))

    p1.start()
    p2.start()
"""
主進程的ID為:7500
主進程的父進程ID為:39284
--------主進程MainProcess開始執(zhí)行--------
mission-2子進程:mission-2
mission-2子進程ID:40552
mission-2子進程的父進程為:7500
用戶李四正在第1次執(zhí)行任務二。
mission-1子進程:mission-1
mission-1子進程ID:46296
mission-1子進程的父進程為:7500
用戶張三正在第1次執(zhí)行任務一。
用戶李四正在第2次執(zhí)行任務二。
用戶張三正在第2次執(zhí)行任務一。
用戶李四正在第3次執(zhí)行任務二。
用戶張三正在第3次執(zhí)行任務一。
用戶李四正在第4次執(zhí)行任務二。
用戶張三正在第4次執(zhí)行任務一。
用戶李四正在第5次執(zhí)行任務二。
用戶張三正在第5次執(zhí)行任務一。

"""

兩個子進程的父ID是相同的就是MainProcess這個主進程的ID

三、進程特點

  • 多進程之間不會共享全局變量
  • 主進程會默認等待子進程結束而結束 但可以通過設置來讓子進程跟著主進程結束而結束

正常情況:

import multiprocessing
import time

def mission1(user, n):
    for i in range(1, n + 1):
        print(f"用戶{user}正在第{i}次執(zhí)行任務一。")
        time.sleep(0.1)

if __name__ == '__main__':
    print(f'--------主進程{multiprocessing.current_process().name}開始執(zhí)行--------')
    p1 = multiprocessing.Process(target=mission1, name='mission-1', args=('張三', 5))
    p1.start()
    time.sleep(0.4) # 讓主進程多執(zhí)行一會兒
    print(f'----------主進程:{multiprocessing.current_process().name}最后一行代碼執(zhí)行完畢---------')

"""
--------主進程MainProcess開始執(zhí)行--------
用戶張三正在第1次執(zhí)行任務一。
用戶張三正在第2次執(zhí)行任務一。
----------主進程:MainProcess最后一行代碼執(zhí)行完畢---------
用戶張三正在第3次執(zhí)行任務一。
用戶張三正在第4次執(zhí)行任務一。
用戶張三正在第5次執(zhí)行任務一。
"""

正常情況下,主進程(最后一行代碼執(zhí)行完了)仍然會等待子進程(p1 mission-1)執(zhí)行完畢.

使用守護進程或者終止進程

import multiprocessing
import time


def mission1(user, n):
    for i in range(1, n + 1):
        print(f"用戶{user}正在第{i}次執(zhí)行任務一。")
        time.sleep(0.1)


if __name__ == '__main__':
    print(f'--------主進程{multiprocessing.current_process().name}開始執(zhí)行--------')

    p1 = multiprocessing.Process(target=mission1, name='mission-1', args=('張三', 5))
    # 方式1: 開啟子進程前提前設置守護主進程
    p1.daemon = True
    p1.start()
    time.sleep(0.4)  # 讓主進程多執(zhí)行一會兒
    # p1.terminate()
    print(f'----------主進程:{multiprocessing.current_process().name}最后一行代碼執(zhí)行完畢---------')

"""
--------主進程MainProcess開始執(zhí)行--------
用戶張三正在第1次執(zhí)行任務一。
用戶張三正在第2次執(zhí)行任務一。
----------主進程:MainProcess最后一行代碼執(zhí)行完畢---------
"""

我們發(fā)現(xiàn)子進程還沒執(zhí)行結束就被終止了。

  • 多進程之間是無序的

以上就是Python使用multiprocessing實現(xiàn)多進程的詳細內容,更多關于Python multiprocessing多線程的資料請關注腳本之家其它相關文章!

相關文章

  • 運籌學-Python實現(xiàn)圖論與最短距離

    運籌學-Python實現(xiàn)圖論與最短距離

    需要求解任意兩個節(jié)點之間的最短距離,使用?Floyd?算法,只要求解單源最短路徑問題,有負權邊時使用?Bellman-Ford?算法,沒有負權邊時使用?Dijkstra?算法,本節(jié)我們只討論Dijkstra?算法,需要的朋友可以參考一下
    2022-01-01
  • python3中apply函數和lambda函數的使用詳解

    python3中apply函數和lambda函數的使用詳解

    本文主要介紹了python3中apply函數和lambda函數的使用詳解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Python中實例化class的執(zhí)行順序示例詳解

    Python中實例化class的執(zhí)行順序示例詳解

    這篇文章主要給大家介紹了關于Python中實例化class的執(zhí)行順序的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用python具有一定的參考學習價值,需要的朋友們隨著小編來一起學習學習吧
    2018-10-10
  • Python時間操作之pytz模塊使用詳解

    Python時間操作之pytz模塊使用詳解

    在學習Python過程中,我們已經了解了一些關于時間操作的庫,如:Python內置庫:time,datatime和第三方庫:dateutil,pytz等。本文將詳細講講pytz模塊的使用,需要的可以參考一下
    2022-06-06
  • Pytorch平均池化nn.AvgPool2d()使用方法實例

    Pytorch平均池化nn.AvgPool2d()使用方法實例

    平均池化層,又叫平均匯聚層,下面這篇文章主要給大家介紹了關于Pytorch平均池化nn.AvgPool2d()使用方法的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • python與字符編碼問題

    python與字符編碼問題

    這篇文章主要介紹了python與字符編碼問題,下面對編碼問題做個簡單的總結,感興趣的朋友跟隨小編一起看看吧
    2019-05-05
  • 對python修改xml文件的節(jié)點值方法詳解

    對python修改xml文件的節(jié)點值方法詳解

    今天小編就為大家分享一篇對python修改xml文件的節(jié)點值方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • 如何使用OpenCV實現(xiàn)手勢音量控制

    如何使用OpenCV實現(xiàn)手勢音量控制

    今天來學習一下如何使用OpenCV實現(xiàn)手勢音量控制,本次實驗需要使用OpenCV和mediapipe庫進行手勢識別,并利用手勢距離控制電腦音量,感興趣的朋友跟隨小編一起看看吧
    2023-11-11
  • python如何通過注冊表動態(tài)管理組件

    python如何通過注冊表動態(tài)管理組件

    使用注冊表的主要優(yōu)勢是可以在運行時動態(tài)創(chuàng)建對象,從而實現(xiàn)高度可配置和可擴展的設計,這篇文章主要介紹了python如何通過注冊表動態(tài)管理組件,需要的朋友可以參考下
    2024-05-05
  • Python圖片檢索之以圖搜圖

    Python圖片檢索之以圖搜圖

    由于很多論文里面的測試圖片沒有標號,就不能確定它們是Testset數據集中哪幾張圖片.為了能解決這個問題,需要完成以圖片去搜索整個數據集文件目錄的任務.本文有非常詳細的圖文示例,需要的朋友可以參考下
    2021-05-05

最新評論