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

深入探究Python中的多進(jìn)程模塊用法實(shí)例

 更新時間:2024年01月16日 11:53:16   作者:簡訊Alfred 愛生活愛扣釘  
多進(jìn)程是計(jì)算機(jī)編程中的一個概念,也可以說是一種可用于實(shí)現(xiàn)并行性和利用多個 CPU 內(nèi)核或處理器并發(fā)執(zhí)行任務(wù)的技術(shù),在本文中,我們將學(xué)習(xí)有關(guān) 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)爬取百度百科詞條功能實(shí)例

    這篇文章主要介紹了Python爬蟲實(shí)現(xiàn)爬取百度百科詞條功能,結(jié)合完整實(shí)例形式分析了Python爬蟲的基本原理及爬取百度百科詞條的步驟、網(wǎng)頁下載、解析、數(shù)據(jù)輸出等相關(guān)操作技巧,需要的朋友可以參考下
    2019-04-04
  • Python中Django的路由配置詳解

    Python中Django的路由配置詳解

    這篇文章主要介紹了Python中Django的路由配置詳解,Python下有許多款不同的?Web?框架,Django是重量級選手中最有代表性的一位,許多成功的網(wǎng)站和APP都基于Django,需要的朋友可以參考下
    2023-07-07
  • 一文詳細(xì)NumPy中np.empty的用法

    一文詳細(xì)NumPy中np.empty的用法

    np.empty是NumPy庫中一個強(qiáng)大但潛在危險的工具,本文主要介紹了一文詳細(xì)NumPy中np.empty的用法,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • python密碼學(xué)黑客攻擊RSA密碼

    python密碼學(xué)黑客攻擊RSA密碼

    這篇文章主要為大家介紹了python密碼學(xué)黑客攻擊RSA密碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Python實(shí)現(xiàn)對字符串中字符提取校驗(yàn)

    Python實(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-10
  • python使用udp實(shí)現(xiàn)聊天器功能

    python使用udp實(shí)現(xiàn)聊天器功能

    這篇文章主要介紹了python使用udp實(shí)現(xiàn)聊天器功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2018-12-12
  • Django接收照片儲存文件的實(shí)例代碼

    Django接收照片儲存文件的實(shí)例代碼

    這篇文章主要介紹了Django接收照片儲存文件的實(shí)例代碼 ,代碼簡單易懂,非常不錯,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • python運(yùn)行其他程序的實(shí)現(xiàn)方法

    python運(yùn)行其他程序的實(shí)現(xiàn)方法

    這篇文章主要介紹了python運(yùn)行其他程序的實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Python中Jieba進(jìn)行詞頻統(tǒng)計(jì)與關(guān)鍵詞提取

    Python中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ù)可視化

    在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

最新評論