程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python 中的多進程

編輯:Python

本文簡要而簡潔地介紹了Python編程語言中的多進程

什麼是多進程?

多進程是指系統同時支持多個處理器的能力。多進程系統中的應用程序被分解為獨立運行的較小例程。操作系統將這些線程分配給處理器,以提高系統的性能。

為什麼選擇多進程?

考慮一個具有單個處理器的計算機系統。如果同時為它分配了多個進程,它將不得不中斷每個任務並短暫切換到另一個任務,以保持所有進程的運行。
這種情況就像廚師獨自在廚房工作一樣。他必須做幾項任務,如烘烤,攪拌,揉面團等。

因此,要點是:您必須同時完成的任務越多,跟蹤所有任務就越困難,並且保持正確的時機變得更加具有挑戰性。
這就是多進程概念出現的地方!
多進程系統可以具有:

  • 多處理器,即具有多個中央處理器的計算機。
  • 多核處理器,即具有兩個或多個獨立實際處理單元(稱為“內核”)的單個計算組件。

在這裡,CPU可以輕松地一次執行多個任務,每個任務都使用自己的處理器。

這就像上一種情況下的廚師在他的助手的協助下一樣。現在,他們可以在自己之間分配任務,廚師不需要在他的任務之間切換。

Python中的多進程

在Python中,多進程模塊包括一個非常簡單直觀的API,用於在多個進程之間劃分工作。
讓我們參考一個使用多處理模塊的簡單示例:

# 導入多進程模塊
import multiprocessing
def print_cube(num):
"""用於打印給定數字的多維數據集的函數"""
print("Cube: {}".format(num * num * num))
def print_square(num):
"""函數打印給定數值的平方"""
print("Square: {}".format(num * num))
if __name__ == "__main__":
# 創建進程
p1 = multiprocessing.Process(target=print_square, args=(10,))
p2 = multiprocessing.Process(target=print_cube, args=(10,))
# 開啟進程1
p1.start()
# 開啟進程2
p2.start()
# 等待進程1完成
p1.join()
# 等待進程2完成
p2.join()
# 進程任務全部完成
print("Done!")

運行結果:

讓我們試著理解上面的代碼:

  • 要導入多進程模塊,我們需要:


import multiprocessing

  • 為了創建一個進程,我們創建了一個進程類的對象。它需要以下參數:

    • 目標:進程要執行的函數
    • args:要傳遞給目標函數的參數

    注意:流程構造函數也采用許多其他參數,稍後將討論。在上面的例子中,我們創建了2個具有不同目標函數的進程:

    p1 = multiprocessing.Process(target=print_square, args=(10, ))
    p2 = multiprocessing.Process(target=print_cube, args=(10, ))
    
  • 要啟動進程,我們使用進程類的啟動方法。

    p1.start()
    p2.start()
    
  • 進程啟動後,當前程序也會繼續執行。為了在進程完成之前停止執行當前程序,我們使用 join 方法。

    p1.join()
    p2.join()
    

    因此,當前程序將首先等待 p1 的完成,然後等待 p2 的完成。一旦它們完成,將執行當前程序的下一個語句。

讓我們考慮另一個程序來理解在同一python腳本上運行的不同進程的概念。在下面的示例中,我們打印運行目標函數的進程的 ID:

# 導入多進程模塊
import multiprocessing
import os
def worker1():
# 打印進程id
print("ID of process running worker1: {}".format(os.getpid()))
def worker2():
# 打印進程id
print("ID of process running worker2: {}".format(os.getpid()))
if __name__ == "__main__":
# 正在打印主程序進程id
print("ID of main process: {}".format(os.getpid()))
# 創建進程
p1 = multiprocessing.Process(target=worker1)
p2 = multiprocessing.Process(target=worker2)
# 開始進程
p1.start()
p2.start()
# 進程ID
print("ID of process p1: {}".format(p1.pid))
print("ID of process p2: {}".format(p2.pid))
# 等待進程完成
p1.join()
p2.join()
# 兩個過程都已完成
print("Both processes finished execution!")
# 檢查進程是否處於活動狀態
print("Process p1 is alive: {}".format(p1.is_alive()))
print("Process p2 is alive: {}".format(p2.is_alive()))

運行結果:

  • 主 python 腳本具有不同的進程 ID,當我們創建進程對象 p1p2 時,多處理模塊會生成具有不同進程 ID 的新進程。在上面的程序中,我們使用os.getpid() 函數來獲取運行當前目標函數的進程的ID。

    請注意,它與我們使用 Process 類的 pid 屬性獲取的 p1p2進程 ID 匹配。

  • 每個進程獨立運行,並有自己的內存空間。

  • 一旦目標函數的執行完成,進程就會終止。在上面的程序中, 我們使用is_alive方法Process類來檢查進程是否仍然處於活動狀態。

考慮下圖,了解新流程與主要Python腳本的不同之處:


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved