RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python多進(jìn)程學(xué)習(xí)

馬哥Linux運(yùn)維 ? 來(lái)源:馬哥Linux運(yùn)維 ? 2023-04-26 11:04 ? 次閱讀

Python 多進(jìn)程 (Multiprocessing) 是一種同時(shí)利用計(jì)算機(jī)多個(gè)處理器核心 (CPU cores) 進(jìn)行并行處理的技術(shù),它與 Python 的多線程 (Multithreading) 技術(shù)不同,因?yàn)槎嗑€程的并發(fā)任務(wù)依賴于一個(gè) GIL (Global Interpreter Lock)。在多進(jìn)程中,每個(gè)進(jìn)程都有自己的解釋器進(jìn)程,并且可以同時(shí)使用多個(gè) CPU 核心,因此在處理計(jì)算密集型任務(wù)時(shí)比多線程更有效。

要使用 Python 的多進(jìn)程,我們需要使用內(nèi)置的 multiprocessing 模塊,該模塊提供了創(chuàng)建和管理進(jìn)程的類和函數(shù),下面是一個(gè)簡(jiǎn)單的 Python 多進(jìn)程的例子:

importmultiprocessing

defworker():
 """子進(jìn)程的工作函數(shù)"""
 print("Starting worker")
 # 這里可以放一些耗時(shí)的任務(wù)
 print("Finished worker")

if__name__=='__main__':
 # 創(chuàng)建一個(gè)子進(jìn)程
 p=multiprocessing.Process(target=worker)
 # 啟動(dòng)子進(jìn)程
 p.start()
 # 等待子進(jìn)程結(jié)束
 p.join()
 print("Parent process finished")

在這個(gè)例子中,我們定義了一個(gè)函數(shù) worker(),這個(gè)函數(shù)是子進(jìn)程要執(zhí)行的任務(wù),我們使用 multiprocessing.Process 類創(chuàng)建了一個(gè)子進(jìn)程,并將 worker() 函數(shù)作為參數(shù)傳遞給 target 參數(shù),然后我們使用 start() 方法啟動(dòng)子進(jìn)程,join() 方法等待子進(jìn)程完成,最后,主進(jìn)程會(huì)輸出一條消息,表示自己已經(jīng)完成了。

除了創(chuàng)建單個(gè)子進(jìn)程,我們還可以使用 Pool 類來(lái)創(chuàng)建多個(gè)子進(jìn)程,以便并行處理多個(gè)任務(wù),下面是一個(gè)使用 Pool 類的例子:

importmultiprocessing

defworker(num):
 """子進(jìn)程的工作函數(shù)"""
 print(f"Starting worker {num}")
 # 這里可以放一些耗時(shí)的任務(wù)
 print(f"Finished worker {num}")

if__name__=='__main__':
 # 創(chuàng)建一個(gè)包含 4 個(gè)進(jìn)程的進(jìn)程池
 withmultiprocessing.Pool(processes=4)aspool:
   # 使用 map 函數(shù)并行執(zhí)行 worker 函數(shù)
   pool.map(worker, [1,2,3,4])
 print("Parent process finished")

在這個(gè)例子中,我們使用 Pool 類創(chuàng)建了一個(gè)包含 4 個(gè)進(jìn)程的進(jìn)程池,然后我們使用 map() 方法并行執(zhí)行 worker() 函數(shù)。map() 方法會(huì)將參數(shù)列表中的每個(gè)參數(shù)依次傳遞給 worker() 函數(shù),并將返回值收集到一個(gè)列表中。最后,主進(jìn)程會(huì)輸出一條消息,表示自己已經(jīng)完成了。

當(dāng)我們需要執(zhí)行一些計(jì)算密集型的任務(wù)時(shí),使用 Python 的多進(jìn)程技術(shù)可以顯著提高程序的執(zhí)行效率,下面是一些使用 Python 的多進(jìn)程技術(shù)的常見場(chǎng)景:

數(shù)據(jù)處理:當(dāng)我們需要處理大量的數(shù)據(jù)時(shí),可以使用多進(jìn)程技術(shù)將數(shù)據(jù)分成多個(gè)部分,并同時(shí)處理它們。

網(wǎng)絡(luò)爬蟲:當(dāng)我們需要爬取大量的網(wǎng)頁(yè)時(shí),可以使用多進(jìn)程技術(shù)將不同的任務(wù)分配給不同的進(jìn)程,從而并行地執(zhí)行它們。

圖像處理:當(dāng)我們需要對(duì)大量的圖像進(jìn)行處理時(shí),可以使用多進(jìn)程技術(shù)并行執(zhí)行不同的處理任務(wù)。

在使用 Python 的多進(jìn)程技術(shù)時(shí),我們需要注意一些問(wèn)題:

進(jìn)程間通信:由于每個(gè)進(jìn)程都有自己的內(nèi)存空間,因此它們之間不能直接共享數(shù)據(jù),我們需要使用 multiprocessing 模塊提供的管道、隊(duì)列等機(jī)制來(lái)實(shí)現(xiàn)進(jìn)程間通信。

進(jìn)程池:在使用 Pool 類時(shí),我們需要注意控制并發(fā)任務(wù)的數(shù)量,以免占用過(guò)多的系統(tǒng)資源。

內(nèi)存限制:由于每個(gè)進(jìn)程都有自己的內(nèi)存空間,因此如果同時(shí)創(chuàng)建太多的進(jìn)程,會(huì)占用過(guò)多的系統(tǒng)內(nèi)存,導(dǎo)致程序崩潰。

下面是一個(gè)使用進(jìn)程池并行執(zhí)行任務(wù)的例子,其中使用了 imap_unordered() 方法來(lái)異步執(zhí)行任務(wù):

importmultiprocessing
importtime

defsquare(x):
 """計(jì)算平方"""
 time.sleep(1) # 模擬耗時(shí)的計(jì)算
 returnx*x

if__name__=='__main__':
 # 創(chuàng)建進(jìn)程池
 withmultiprocessing.Pool()aspool:
   # 異步執(zhí)行任務(wù)
   forresultinpool.imap_unordered(square,range(10)):
     print(result)

在這個(gè)例子中,我們創(chuàng)建了一個(gè)包含默認(rèn)進(jìn)程數(shù)的進(jìn)程池,然后使用 imap_unordered() 方法并行執(zhí)行 square() 函數(shù)。imap_unordered() 方法會(huì)返回一個(gè)迭代器,每次迭代都會(huì)返回一個(gè)已經(jīng)完成的任務(wù)的結(jié)果。由于我們使用了異步執(zhí)行,因此任務(wù)的返回順序不一定與參數(shù)的順序相同。

除了使用 imap_unordered() 方法,我們還可以使用 imap() 方法,它會(huì)按照參數(shù)的順序返回任務(wù)的結(jié)果,此外,我們還可以使用 apply() 和 apply_async() 方法來(lái)執(zhí)行單個(gè)任務(wù)或異步執(zhí)行單個(gè)任務(wù)。

總的來(lái)說(shuō),使用 Python 的多進(jìn)程技術(shù)可以幫助我們更有效地處理計(jì)算密集型任務(wù),通過(guò)使用 multiprocessing 模塊和 Pool 類,我們可以輕松地創(chuàng)建和管理多個(gè)子進(jìn)程,并使它們并行地執(zhí)行任務(wù)。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19259

    瀏覽量

    229649
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10854

    瀏覽量

    211574
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4327

    瀏覽量

    62569
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4792

    瀏覽量

    84627
  • 多進(jìn)程
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    2615

原文標(biāo)題:Python多進(jìn)程學(xué)習(xí)

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    實(shí)驗(yàn):編寫多進(jìn)程程序

    1.實(shí)驗(yàn)?zāi)康?通過(guò)編寫多進(jìn)程程序,使讀者熟練掌握f(shuō)ork()、exec()、wait()和waitpid()等函數(shù)的使用,進(jìn)一步理解在Linux中多進(jìn)程編程的步驟。 2.實(shí)驗(yàn)內(nèi)容 該實(shí)驗(yàn)有3個(gè)進(jìn)程
    發(fā)表于 09-05 15:32

    labview有多進(jìn)程嗎?

    labview有多進(jìn)程嗎?
    發(fā)表于 02-03 17:13

    多線程和多進(jìn)程的區(qū)別

    6.你的數(shù)據(jù)庫(kù)一會(huì)又500個(gè)連接數(shù),一會(huì)有10個(gè),你分析一下情況7.udp和tcp的區(qū)別8.多線程和多進(jìn)程的區(qū)別9.有一臺(tái)web服務(wù)器,你選擇用多線程還是多進(jìn)程,...
    發(fā)表于 07-19 07:21

    淺談多進(jìn)程多線程的選擇

    魚還是熊掌:淺談多進(jìn)程多線程的選擇關(guān)于多進(jìn)程和多線程,教科書上最經(jīng)典的一句話是“進(jìn)程是資源分配的最小單位,線程是CPU調(diào)度的最小單位”,這句話應(yīng)付考試基本上夠了,但如果在工作中遇到類似的選擇
    發(fā)表于 08-24 07:38

    python多線程和多進(jìn)程對(duì)比

    適合在對(duì)CPU計(jì)算運(yùn)算要求較高的場(chǎng)景下使用,譬如大數(shù)據(jù)分析,機(jī)器學(xué)習(xí)多進(jìn)程雖然總是最快的,但是不一定是最優(yōu)的選擇,因?yàn)樗枰狢PU資源支持下才能體現(xiàn)優(yōu)勢(shì)
    發(fā)表于 03-15 16:42

    進(jìn)程控制開發(fā)之編寫多進(jìn)程程序?qū)嶒?yàn)解析

    7.4.1 編寫多進(jìn)程程序 1.實(shí)驗(yàn)?zāi)康?通過(guò)編寫多進(jìn)程程序,使讀者熟練掌握f(shuō)ork()、exec()、wait()和waitpid()等函數(shù)的使用,進(jìn)一步理解在Linux中多進(jìn)程編程的步驟。 2.
    發(fā)表于 10-18 16:33 ?0次下載
    <b class='flag-5'>進(jìn)程</b>控制開發(fā)之編寫<b class='flag-5'>多進(jìn)程</b>程序?qū)嶒?yàn)解析

    python多線程與多進(jìn)程的區(qū)別

    Python的設(shè)計(jì)哲學(xué)是“優(yōu)雅”、“明確”、“簡(jiǎn)單”。因此,Perl語(yǔ)言中“總是有多種方法來(lái)做同一件事”的理念在Python開發(fā)者中通常是難以忍受的。Python開發(fā)者的哲學(xué)是“用一種方法,最好是只有一種方法來(lái)做一件事”。在設(shè)計(jì)
    發(fā)表于 12-01 09:04 ?6182次閱讀
    <b class='flag-5'>python</b>多線程與<b class='flag-5'>多進(jìn)程</b>的區(qū)別

    如何選好多線程和多進(jìn)程

    關(guān)于多進(jìn)程和多線程,教科書上最經(jīng)典的一句話是“進(jìn)程是資源分配的最小單位,線程是CPU調(diào)度的最小單位”,這句話應(yīng)付考試基本上夠了,但如果在工作中遇到類似的選擇問(wèn)題,那就沒(méi)有這么簡(jiǎn)單了,選的不好,會(huì)讓你深受其害。
    的頭像 發(fā)表于 05-11 16:16 ?2960次閱讀
    如何選好多線程和<b class='flag-5'>多進(jìn)程</b>

    使用Python多進(jìn)程的理由

    Python 是運(yùn)行在解釋器中的語(yǔ)言,查找資料知道, python 中有一個(gè)全局鎖( GI),在使用多進(jìn)程( Threa)的情況下,不能發(fā)揮多核的優(yōu)勢(shì)。而使用多進(jìn)程( Multipro
    的頭像 發(fā)表于 04-04 16:50 ?1595次閱讀
    使用<b class='flag-5'>Python</b><b class='flag-5'>多進(jìn)程</b>的理由

    淺談Linux網(wǎng)絡(luò)編程中的多進(jìn)程和多線程

    在Linux網(wǎng)絡(luò)編程中,我們應(yīng)該見過(guò)很多網(wǎng)絡(luò)框架或者server,有多進(jìn)程的處理方式,也有多線程處理方式,孰好孰壞并沒(méi)有可比性,首先選擇多進(jìn)程還是多線程我們需要考慮業(yè)務(wù)場(chǎng)景,其次結(jié)合當(dāng)前部署環(huán)境,是云原生還是傳統(tǒng)的IDC等,最后考慮可維護(hù)性,其具體的對(duì)比在第三部分具體會(huì)展
    發(fā)表于 08-08 16:56 ?822次閱讀
    淺談Linux網(wǎng)絡(luò)編程中的<b class='flag-5'>多進(jìn)程</b>和多線程

    關(guān)于Python多進(jìn)程和多線程詳解

    進(jìn)程(process)和線程(thread)是操作系統(tǒng)的基本概念,但是它們比較抽象,不容易掌握。關(guān)于多進(jìn)程和多線程,教科書上最經(jīng)典的一句話是“進(jìn)程是資源分配的最小單位,線程是CPU調(diào)度的最小單位”。
    的頭像 發(fā)表于 11-06 14:46 ?845次閱讀
    關(guān)于<b class='flag-5'>Python</b><b class='flag-5'>多進(jìn)程</b>和多線程詳解

    shell腳本實(shí)現(xiàn)并發(fā)多進(jìn)程

    在Shell腳本中實(shí)現(xiàn)并發(fā)多進(jìn)程可以使用以下方法: 使用符號(hào)來(lái)將其放入后臺(tái)執(zhí)行,從而實(shí)現(xiàn)并發(fā)多進(jìn)程。例如: #!/bin/bash command1 command3 符號(hào),它們將在后臺(tái)并發(fā)執(zhí)行
    的頭像 發(fā)表于 11-08 10:20 ?1313次閱讀

    Linux系統(tǒng)上多線程和多進(jìn)程的運(yùn)行效率

    關(guān)于多進(jìn)程和多線程,教科書上最經(jīng)典的一句話是“進(jìn)程是資源分配的最小單位,線程是CPU調(diào)度的最小單位”,這句話應(yīng)付考試基本上夠了,但如果在工作中遇到類似的選擇問(wèn)題,那就沒(méi)有這么簡(jiǎn)單了,選的不好,會(huì)讓你
    的頭像 發(fā)表于 11-10 10:54 ?1385次閱讀
    Linux系統(tǒng)上多線程和<b class='flag-5'>多進(jìn)程</b>的運(yùn)行效率

    你還是分不清多進(jìn)程和多線程嗎?一文搞懂!

    你還是分不清多進(jìn)程和多線程嗎?一文搞懂! 多進(jìn)程和多線程是并發(fā)編程中常見的兩個(gè)概念,它們都可以用于提高程序的性能和效率。但是它們的實(shí)現(xiàn)方式和使用場(chǎng)景略有不同。 1. 多進(jìn)程多進(jìn)程
    的頭像 發(fā)表于 12-19 16:07 ?560次閱讀

    Python中多線程和多進(jìn)程的區(qū)別

    Python作為一種高級(jí)編程語(yǔ)言,提供了多種并發(fā)編程的方式,其中多線程與多進(jìn)程是最常見的兩種方式之一。在本文中,我們將探討Python中多線程與多進(jìn)程的概念、區(qū)別以及如何使用線程池與
    的頭像 發(fā)表于 10-23 11:48 ?392次閱讀
    <b class='flag-5'>Python</b>中多線程和<b class='flag-5'>多進(jìn)程</b>的區(qū)別
    RM新时代网站-首页