深入探究Python中的多進(jìn)程模塊用法實(shí)例
什么是多進(jìn)程
多進(jìn)程是計(jì)算機(jī)編程中的一個概念,也可以說是一種可用于實(shí)現(xiàn)并行性和利用多個 CPU 內(nèi)核或處理器并發(fā)執(zhí)行任務(wù)的技術(shù)。這種技術(shù)尤其適用于受 CPU 限制的任務(wù),并行執(zhí)行可以提高程序的性能。Python 提供了多進(jìn)程模塊來處理多個進(jìn)程。
多進(jìn)程(Multiprocessing)是一種計(jì)算機(jī)編程和執(zhí)行范式,涉及多個進(jìn)程或程序的同時執(zhí)行,方法是根據(jù)我們正在處理的問題或設(shè)置,在單臺計(jì)算機(jī)或多臺計(jì)算機(jī)上利用多個 CPU 內(nèi)核或處理器。
多進(jìn)程是并行的一種形式,旨在通過允許任務(wù)并發(fā)執(zhí)行來提高程序性能和效率,從而有效利用可用的計(jì)算資源。
下文將討論多進(jìn)程的幾個組成部分。
1. 進(jìn)程:每個任務(wù)或工作單位或進(jìn)程都封裝在一個單獨(dú)的進(jìn)程中,這是一個獨(dú)立的程序執(zhí)行單元。這些進(jìn)程可以相互獨(dú)立地同時運(yùn)行。
2. 并行執(zhí)行:多個進(jìn)程(如計(jì)算、數(shù)據(jù)處理或多個請求處理)可以通過多進(jìn)程并行執(zhí)行,從而同時執(zhí)行任務(wù)。
3. 資源利用:多處理是一種技術(shù),通過將任務(wù)分配給多個 CPU 內(nèi)核,有效利用現(xiàn)代計(jì)算機(jī)的處理能力,尤其是多核處理器(如四核或八核)。
4. 隔離:在多進(jìn)程中,進(jìn)程之間是相互隔離的。這意味著,一個進(jìn)程的操作或故障不會直接影響其他進(jìn)程。這種隔離處理增強(qiáng)了系統(tǒng)的穩(wěn)定性。
5. 進(jìn)程間通信(IPC):進(jìn)程間通信機(jī)制(如共享內(nèi)存、管道、隊(duì)列和套接字)允許進(jìn)程交換數(shù)據(jù)并協(xié)調(diào)其活動。
6. 可擴(kuò)展性:多進(jìn)程可以進(jìn)行擴(kuò)展,以利用許多處理器甚至分布式計(jì)算集群的能力來解決計(jì)算密集型問題。
多線程與多進(jìn)程的區(qū)別
想象一下你和兩個助手在廚房里做飯。多線程就像是讓這兩個助手在同一個廚房里完成一項(xiàng)任務(wù)。這無疑會加快進(jìn)程,兩個人同時完成一項(xiàng)任務(wù)。在同一個廚房工作的這些助手可以共享相同的食材,可以互相交流,可以輕松分擔(dān)任務(wù)。但是也可能會變得混亂,他們在工作時可能會相互碰撞,從而破壞所有的進(jìn)度。
多進(jìn)程就像有兩個幫手,在兩個不同的廚房工作,使用各自的食材和個人空間。這些助手可以獨(dú)立工作,互不干擾,但如果他們需要分享食材或交談,就必須使用電話。
從這個例子中,我們可以了解到,多線程是一種很好的技術(shù),適用于助手不需要頻繁移動的任務(wù),因?yàn)樘幚砥鞑恍枰褂么罅抠Y源。然而多進(jìn)程更適合需要大量移動的任務(wù),或者從技術(shù)上講需要同時使用內(nèi)核的大量資源的任務(wù)。
如果我們用一句話來定義,多線程主要是實(shí)現(xiàn)并發(fā)性,允許任務(wù)在時間上重疊,而多進(jìn)程則是實(shí)現(xiàn)真正的并行性,因?yàn)槊總€進(jìn)程都在不同的 CPU 內(nèi)核或處理器上獨(dú)立運(yùn)行。
在 python 中執(zhí)行多進(jìn)程的第一步是導(dǎo)入模塊。
import multiprocessing
我們要使用多進(jìn)程來運(yùn)行一個程序。讓我們創(chuàng)建一個用戶自定義程序示例,看看如何操作:
def test(): print("This is my sample program") test() # Output: # This is my sample program
要使用多進(jìn)程調(diào)用該程序,我們將使用以下代碼。
import multiprocessing def test01(): print("This is a sample multiprocessing program") if __name__ == "__main__": m = multiprocessing.Process(target=test01) print("this is my main program") # start the program m.start() # stop/terminate the program and release the resource m.join()
在上面的代碼中,我們通過 main
函數(shù)使用多進(jìn)程調(diào)用我們要處理的程序。并且確保只有在直接執(zhí)行該腳本時,而不是作為模塊導(dǎo)入時,代碼才會運(yùn)行。
我們還可以在其他函數(shù)中使用多進(jìn)程,執(zhí)行一些邏輯運(yùn)算,下面給出了一個例子。
import multiprocessing def square(n): return n**2 if __name__ == '__main__': with multiprocessing.Pool(processes=5) as pool: out = pool.map(square, [12,2,3,5,23,14,26,8,4,6]) print(out) # Output: # [144, 4, 9, 25, 529, 196, 676, 64, 16, 36]
并行執(zhí)行函數(shù)
運(yùn)行多個進(jìn)程
我們可以使用多進(jìn)程技術(shù)在多個內(nèi)核上運(yùn)行多個進(jìn)程。我們創(chuàng)建并啟動多個進(jìn)程,每個進(jìn)程都運(yùn)行帶有一組參數(shù)的函數(shù) "workers"(如下代碼所示)。我們使用 "args "來指定函數(shù)要使用的參數(shù)列表。
在下面的代碼中,我們使用多進(jìn)程的概念,使用 4 個進(jìn)程來處理程序。為此,我們使用了 python 中多進(jìn)程模塊的 Process
方法。
def workers(num): print(f"Worker number {num}") if __name__ == "__main__": processes = [] for i in range(4): process = multiprocessing.Process(target=workers, args=(i,)) processes.append(process) process.start() for process in processes: process.join() Output: Worker number 0 Worker number 1 Worker number 2 Worker number 3
進(jìn)程間共享數(shù)據(jù)
使用 multiprocessing.Queue
multiprocessing.Queue
是 Python 編程語言中的一個類,由 multiprocessing
模塊提供,我們用它來執(zhí)行 python 中的多進(jìn)程處理。這里的 Queue
用于促進(jìn)多進(jìn)程程序中不同進(jìn)程之間的通信和數(shù)據(jù)交換。
multiprocessing.Queue
的一些主要功能和用途如下:
• 進(jìn)程間通信:它允許多個進(jìn)程通過使用共同的數(shù)據(jù)結(jié)構(gòu)(隊(duì)列)安全地交換數(shù)據(jù)。每個進(jìn)程都可以將數(shù)據(jù)放入隊(duì)列或從中檢索數(shù)據(jù)。
• 線程安全:它的設(shè)計(jì)方式確保了線程安全和進(jìn)程安全,這意味著它可以在多線程或多進(jìn)程環(huán)境中安全使用,而不會出現(xiàn)競賽條件或數(shù)據(jù)損壞。
• 先進(jìn)先出隊(duì)列始終遵循 FIFO 即先進(jìn)先出原則,這意味著第一個放入隊(duì)列的項(xiàng)目也將是第一個出來的項(xiàng)目。
• 阻塞操作:當(dāng)一個進(jìn)程試圖從一個空隊(duì)列中檢索一個項(xiàng)目或向一個已填滿的隊(duì)列中插入一個項(xiàng)目時,該操作將阻塞,直到條件發(fā)生變化。這種進(jìn)程/行為對于進(jìn)程間的同步非常有用。
在使用 Python 進(jìn)行并行或并發(fā)處理時,multiprocessing.Queue
是一個非常有用的工具,尤其是在多個進(jìn)程需要共享和協(xié)調(diào)數(shù)據(jù)的情況下。
下面的單元格給出了一個如何使用 multiprocessing.Queue
的示例:生產(chǎn)者進(jìn)程生產(chǎn)數(shù)據(jù)或?qū)?shù)據(jù)放入隊(duì)列,消費(fèi)者進(jìn)程從隊(duì)列中消費(fèi)數(shù)據(jù)。多進(jìn)程隊(duì)列 確保了兩個進(jìn)程之間安全的數(shù)據(jù)交換。
import multiprocessing import time #defining our function we want to apply multiprocessing on #01 the producer function to add elements in the queue def producer(q): for item in range(5): q.put(item) print(f"Produced: {item}") #02 consumer function to get elements from the queue def consumer(q): while True: item = q.get() if item is None: break print(f"Consumed: {item}") if __name__ == "__main__": #creating a multiprocessing queue q = multiprocessing.Queue() #creating the producer and consumer processes producer_process = multiprocessing.Process(target=producer, args=(q,)) consumer_process = multiprocessing.Process(target=consumer, args=(q,)) #starting the processes producer_process.start() consumer_process.start() #finish the producer, signal the consumer to exit producer_process.join() q.put(None) #signaling the consumer about no more data in the queue consumer_process.join() Output: Produced: 0 Produced: 1 Consumed: 0Produced: 2 Produced: 3Consumed: 1 Produced: 4 Consumed: 2 Consumed: 3 Consumed: 4
進(jìn)程池
使用 multiprocessing.Pool 類
multiprocessing.Pool 是 python 中 multiprocessing 模塊提供的另一個類。它用于創(chuàng)建和管理可并行執(zhí)行任務(wù)的進(jìn)程池。該類簡化了并行任務(wù)并將其分配給多個進(jìn)程的過程。
下面列出了 multiprocessing.Pool 的一些功能和用途。
• multiprocessing.Pool 用于在 python 中實(shí)現(xiàn)并行處理。它允許我們并發(fā)執(zhí)行多個任務(wù),充分利用多核 CPU 的優(yōu)勢,并有可能提高 CPU 相關(guān)操作的性能。
• 任務(wù)分配:我們可以使用 multiprocessing.Pool 在工作進(jìn)程池中分配任務(wù)。它對工作進(jìn)程的管理進(jìn)行了抽象,使并行工作變得更容易。
• 資源管理:進(jìn)程池會根據(jù)可用的 CPU 內(nèi)核自動管理工作進(jìn)程的創(chuàng)建和銷毀。我們可以指定要使用的工作進(jìn)程數(shù)量,其余的由進(jìn)程池處理。
• 負(fù)載平衡:進(jìn)程池會在工作進(jìn)程之間有效分配任務(wù),確保每個工作進(jìn)程都能獲得同等的工作量。這種負(fù)載平衡對于優(yōu)化并行處理至關(guān)重要。
• 結(jié)果收集:我們可以從工作進(jìn)程中收集結(jié)果。當(dāng)任務(wù)產(chǎn)生的結(jié)果需要匯總或進(jìn)一步處理時,這一點(diǎn)尤其有用。
• 上下文管理器:它還可以充當(dāng)上下文管理器,確保在不再需要時正確關(guān)閉池并終止工作進(jìn)程。
下面的單元格顯示了一個使用 multiprocessing.Pool 的示例代碼,通過一個返回給定數(shù)字平方的簡單函數(shù)對進(jìn)程進(jìn)行多進(jìn)程處理。
def square(x): return x**2 if __name__=='__main__': #create a multiprocessing pool with 4 worker processes with multiprocessing.Pool(processes=4) as pool: #distribute the tasks among worker processes and collect results results = pool.map(square, [2,5,3,2,1,7,8,5,6,2,2,3]) #print the results print(results) Output: [4, 25, 9, 4, 1, 49, 64, 25, 36, 4, 4, 9]
以上就是深入探究Python中的多進(jìn)程用法實(shí)例的詳細(xì)內(nèi)容,更多關(guān)于Python 多進(jìn)程的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python爬蟲實(shí)現(xiàn)爬取百度百科詞條功能實(shí)例
這篇文章主要介紹了Python爬蟲實(shí)現(xiàn)爬取百度百科詞條功能,結(jié)合完整實(shí)例形式分析了Python爬蟲的基本原理及爬取百度百科詞條的步驟、網(wǎng)頁下載、解析、數(shù)據(jù)輸出等相關(guān)操作技巧,需要的朋友可以參考下2019-04-04Python實(shí)現(xiàn)對字符串中字符提取校驗(yàn)
眾所周知,python之所以很方便在一定程度上是因?yàn)殡S時都可能有人又創(chuàng)作了一個好用又方便的python非標(biāo)準(zhǔn)庫。本文就來用Python實(shí)現(xiàn)對字符串中字符進(jìn)行提取校驗(yàn),需要的可以參考一下2022-10-10python運(yùn)行其他程序的實(shí)現(xiàn)方法
這篇文章主要介紹了python運(yùn)行其他程序的實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下2017-07-07Python中Jieba進(jìn)行詞頻統(tǒng)計(jì)與關(guān)鍵詞提取
本文主要介紹了Python中Jieba進(jìn)行詞頻統(tǒng)計(jì)與關(guān)鍵詞提取,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03在Python中利用Bokeh創(chuàng)建動態(tài)數(shù)據(jù)可視化
在本文中,我們探討了如何利用 Bokeh 庫在 Python 中創(chuàng)建動態(tài)數(shù)據(jù)可視化,我們介紹了 Bokeh 的基本概念和優(yōu)勢,以及如何安裝 Bokeh 庫,對在Python中利用Bokeh創(chuàng)建動態(tài)數(shù)據(jù)可視化相關(guān)知識感興趣的朋友跟隨小編一起看看吧2024-05-05