一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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)程的區(qū)別

馬哥Linux運(yùn)維 ? 來源:華為云開發(fā)者聯(lián)盟 ? 2024-10-23 11:48 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文分享自華為云社區(qū)《Python中的多線程與多進(jìn)程編程大全【python指南】》,作者:檸檬味擁抱。

Python作為一種高級(jí)編程語言,提供了多種并發(fā)編程的方式,其中多線程與多進(jìn)程是最常見的兩種方式之一。在本文中,我們將探討Python中多線程與多進(jìn)程的概念、區(qū)別以及如何使用線程池與進(jìn)程池來提高并發(fā)執(zhí)行效率。

多線程與多進(jìn)程的概念

多線程

多線程是指在同一進(jìn)程內(nèi),多個(gè)線程并發(fā)執(zhí)行。每個(gè)線程都擁有自己的執(zhí)行棧和局部變量,但共享進(jìn)程的全局變量、靜態(tài)變量等資源。多線程適合用于I/O密集型任務(wù),如網(wǎng)絡(luò)請(qǐng)求、文件操作等,因?yàn)榫€程在等待I/O操作完成時(shí)可以釋放GIL(全局解釋器鎖),允許其他線程執(zhí)行。

多進(jìn)程

多進(jìn)程是指在操作系統(tǒng)中同時(shí)運(yùn)行多個(gè)進(jìn)程,每個(gè)進(jìn)程都有自己獨(dú)立的內(nèi)存空間,相互之間不受影響。多進(jìn)程適合用于CPU密集型任務(wù),如計(jì)算密集型算法、圖像處理等,因?yàn)槎噙M(jìn)程可以利用多核CPU并行執(zhí)行任務(wù),提高整體運(yùn)算速度。

線程池與進(jìn)程池的介紹

線程池

線程池是一種預(yù)先創(chuàng)建一定數(shù)量的線程并維護(hù)這些線程,以便在需要時(shí)重復(fù)使用它們的技術(shù)。線程池可以減少線程創(chuàng)建和銷毀的開銷,提高線程的重復(fù)利用率。在Python中,可以使用concurrent.futures.ThreadPoolExecutor來創(chuàng)建線程池。

進(jìn)程池

進(jìn)程池類似于線程池,不同之處在于進(jìn)程池預(yù)先創(chuàng)建一定數(shù)量的進(jìn)程并維護(hù)這些進(jìn)程,以便在需要時(shí)重復(fù)使用它們。進(jìn)程池可以利用多核CPU并行執(zhí)行任務(wù),提高整體運(yùn)算速度。在Python中,可以使用concurrent.futures.ProcessPoolExecutor來創(chuàng)建進(jìn)程池。

線程池與進(jìn)程池的應(yīng)用示例

下面是一個(gè)簡(jiǎn)單的示例,演示了如何使用線程池和進(jìn)程池來執(zhí)行一組任務(wù)。


import concurrent.futures
import time


def task(n):
    print(f"Start task {n}")
    time.sleep(2)
    print(f"End task {n}")
    return f"Task {n} result"


def main():
    # 使用線程池
    with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
        results = executor.map(task, range(5))
        for result in results:
            print(result)


    # 使用進(jìn)程池
    with concurrent.futures.ProcessPoolExecutor(max_workers=3) as executor:
        results = executor.map(task, range(5))
        for result in results:
            print(result)


if __name__ == "__main__":
    main()

在上面的示例中,我們定義了一個(gè)task函數(shù),模擬了一個(gè)耗時(shí)的任務(wù)。然后,我們使用ThreadPoolExecutor創(chuàng)建了一個(gè)線程池,并使用map方法將任務(wù)提交給線程池執(zhí)行。同樣地,我們也使用ProcessPoolExecutor創(chuàng)建了一個(gè)進(jìn)程池,并使用map方法提交任務(wù)。最后,我們打印出每個(gè)任務(wù)的結(jié)果。

線程池與進(jìn)程池的性能比較

4004dea2-904a-11ef-a511-92fbcf53809c.png

雖然線程池與進(jìn)程池都可以用來實(shí)現(xiàn)并發(fā)執(zhí)行任務(wù),但它們之間存在一些性能上的差異。

線程池的優(yōu)勢(shì)

輕量級(jí): 線程比進(jìn)程更輕量級(jí),創(chuàng)建和銷毀線程的開銷比創(chuàng)建和銷毀進(jìn)程要小。

共享內(nèi)存: 線程共享同一進(jìn)程的內(nèi)存空間,可以方便地共享數(shù)據(jù)。

低開銷: 在切換線程時(shí),線程只需保存和恢復(fù)棧和寄存器的狀態(tài),開銷較低。

進(jìn)程池的優(yōu)勢(shì)

真正的并行: 進(jìn)程可以利用多核CPU真正并行執(zhí)行任務(wù),而線程受到GIL的限制,在多核CPU上無法真正并行執(zhí)行。

穩(wěn)定性: 進(jìn)程之間相互獨(dú)立,一個(gè)進(jìn)程崩潰不會(huì)影響其他進(jìn)程,提高了程序的穩(wěn)定性。

資源隔離: 每個(gè)進(jìn)程有自己獨(dú)立的內(nèi)存空間,可以避免多個(gè)線程之間的內(nèi)存共享問題。

性能比較示例

下面是一個(gè)簡(jiǎn)單的性能比較示例,演示了線程池和進(jìn)程池在執(zhí)行CPU密集型任務(wù)時(shí)的性能差異。


import concurrent.futures
import time


def cpu_bound_task(n):
    result = 0
    for i in range(n):
        result += i
    return result


def main():
    start_time = time.time()


    # 使用線程池執(zhí)行CPU密集型任務(wù)
    with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
        results = executor.map(cpu_bound_task, [1000000] * 3)


    print("Time taken with ThreadPoolExecutor:", time.time() - start_time)


    start_time = time.time()


    # 使用進(jìn)程池執(zhí)行CPU密集型任務(wù)
    with concurrent.futures.ProcessPoolExecutor(max_workers=3) as executor:
        results = executor.map(cpu_bound_task, [1000000] * 3)


    print("Time taken with ProcessPoolExecutor:", time.time() - start_time)


if __name__ == "__main__":
    main()

在上面的示例中,我們定義了一個(gè)cpu_bound_task函數(shù),模擬了一個(gè)CPU密集型任務(wù)。然后,我們使用ThreadPoolExecutor和ProcessPoolExecutor分別創(chuàng)建線程池和進(jìn)程池,并使用map方法提交任務(wù)。最后,我們比較了兩種方式執(zhí)行任務(wù)所花費(fèi)的時(shí)間。

通過運(yùn)行以上代碼,你會(huì)發(fā)現(xiàn)使用進(jìn)程池執(zhí)行CPU密集型任務(wù)的時(shí)間通常會(huì)比使用線程池執(zhí)行快,這是因?yàn)檫M(jìn)程池可以利用多核CPU真正并行執(zhí)行任務(wù),而線程池受到GIL的限制,在多核CPU上無法真正并行執(zhí)行。

401fa002-904a-11ef-a511-92fbcf53809c.png

當(dāng)考慮如何實(shí)現(xiàn)一個(gè)能夠同時(shí)下載多個(gè)文件的程序時(shí),線程池和進(jìn)程池就成為了很有用的工具。讓我們看看如何用線程池和進(jìn)程池來實(shí)現(xiàn)這個(gè)功能。

首先,我們需要導(dǎo)入相應(yīng)的庫:

import concurrent.futures
import requests
import time

然后,我們定義一個(gè)函數(shù)來下載文件:


def download_file(url):
    filename = url.split("/")[-1]
    print(f"Downloading {filename}")
    response = requests.get(url)
    with open(filename, "wb") as file:
        file.write(response.content)
    print(f"Downloaded {filename}")
    return filename

接下來,我們定義一個(gè)函數(shù)來下載多個(gè)文件,這里我們使用線程池和進(jìn)程池來分別執(zhí)行:


def download_files_with_thread_pool(urls):
    start_time = time.time()
    with concurrent.futures.ThreadPoolExecutor() as executor:
        results = executor.map(download_file, urls)
    print("Time taken with ThreadPoolExecutor:", time.time() - start_time)


def download_files_with_process_pool(urls):
    start_time = time.time()
    with concurrent.futures.ProcessPoolExecutor() as executor:
        results = executor.map(download_file, urls)
    print("Time taken with ProcessPoolExecutor:", time.time() - start_time)

最后,我們定義一個(gè)主函數(shù)來測(cè)試這兩種方式的性能:


def main():
    urls = [
        "https://www.example.com/file1.txt",
        "https://www.example.com/file2.txt",
        "https://www.example.com/file3.txt",
        # Add more URLs if needed
    ]


    download_files_with_thread_pool(urls)
    download_files_with_process_pool(urls)


if __name__ == "__main__":
    main()

通過運(yùn)行以上代碼,你可以比較使用線程池和進(jìn)程池下載文件所花費(fèi)的時(shí)間。通常情況下,當(dāng)下載大量文件時(shí),使用進(jìn)程池的性能會(huì)更好,因?yàn)樗梢岳枚嗪薈PU實(shí)現(xiàn)真正的并行下載。而使用線程池則更適合于I/O密集型任務(wù),如網(wǎng)絡(luò)請(qǐng)求,因?yàn)榫€程在等待I/O操作完成時(shí)可以釋放GIL,允許其他線程執(zhí)行。

這個(gè)例子展示了如何利用線程池和進(jìn)程池來提高并發(fā)下載文件的效率,同時(shí)也強(qiáng)調(diào)了根據(jù)任務(wù)特點(diǎn)選擇合適的并發(fā)編程方式的重要性。

并發(fā)編程中的注意事項(xiàng)

雖然線程池與進(jìn)程池提供了方便的并發(fā)執(zhí)行任務(wù)的方式,但在實(shí)際應(yīng)用中還需要注意一些問題,以避免出現(xiàn)潛在的并發(fā)問題和性能瓶頸。

共享資源的同步

在多線程編程中,共享資源的訪問需要進(jìn)行同步,以避免競(jìng)爭(zhēng)條件和數(shù)據(jù)不一致性問題。可以使用鎖、信號(hào)量等同步機(jī)制來保護(hù)關(guān)鍵資源的訪問。

在多進(jìn)程編程中,由于進(jìn)程之間相互獨(dú)立,共享資源的同步相對(duì)簡(jiǎn)單,可以使用進(jìn)程間通信(如管道、隊(duì)列)來傳遞數(shù)據(jù),避免數(shù)據(jù)競(jìng)爭(zhēng)問題。

內(nèi)存消耗與上下文切換

創(chuàng)建大量線程或進(jìn)程可能會(huì)導(dǎo)致內(nèi)存消耗增加,甚至引起內(nèi)存泄漏問題。因此,在設(shè)計(jì)并發(fā)程序時(shí)需要注意資源的合理利用,避免創(chuàng)建過多的線程或進(jìn)程。

上下文切換也會(huì)帶來一定的開銷,特別是在頻繁切換的情況下。因此,在選擇并發(fā)編程方式時(shí),需要綜合考慮任務(wù)的特點(diǎn)和系統(tǒng)資源的限制,以及上下文切換的開銷。

異常處理與任務(wù)超時(shí)

在并發(fā)執(zhí)行任務(wù)時(shí),需要注意異常處理機(jī)制,及時(shí)捕獲和處理任務(wù)中可能出現(xiàn)的異常,以保證程序的穩(wěn)定性和可靠性。

另外,為了避免任務(wù)阻塞導(dǎo)致整個(gè)程序停滯,可以設(shè)置任務(wù)的超時(shí)時(shí)間,并在超時(shí)后取消任務(wù)或進(jìn)行相應(yīng)的處理。

最佳實(shí)踐與建議

在實(shí)際應(yīng)用中,為了編寫高效、穩(wěn)定的并發(fā)程序,可以遵循以下一些最佳實(shí)踐和建議:

合理設(shè)置并發(fā)度: 根據(jù)系統(tǒng)資源和任務(wù)特點(diǎn),合理設(shè)置線程池或進(jìn)程池的大小,避免創(chuàng)建過多的線程或進(jìn)程。

合理分配任務(wù): 根據(jù)任務(wù)的類型和特點(diǎn),合理分配任務(wù)到線程池或進(jìn)程池中,以充分利用系統(tǒng)資源。

注意異常處理: 在任務(wù)執(zhí)行過程中及時(shí)捕獲和處理異常,保證程序的穩(wěn)定性和可靠性。

監(jiān)控與調(diào)優(yōu): 使用監(jiān)控工具和性能分析工具對(duì)并發(fā)程序進(jìn)行監(jiān)控和調(diào)優(yōu),及時(shí)發(fā)現(xiàn)和解決性能瓶頸和潛在問題。

通過遵循以上最佳實(shí)踐和建議,可以編寫出高效、穩(wěn)定的并發(fā)程序,提高程序的執(zhí)行效率和性能。同時(shí),也可以避免一些常見的并發(fā)編程陷阱和問題,確保程序的質(zhì)量和可靠性。

總結(jié)

本文介紹了在Python中使用線程池和進(jìn)程池來實(shí)現(xiàn)并發(fā)編程的方法,并提供了相應(yīng)的代碼示例。首先,我們討論了多線程和多進(jìn)程的概念及其在并發(fā)編程中的應(yīng)用場(chǎng)景。然后,我們深入探討了線程池和進(jìn)程池的工作原理以及它們之間的性能比較。

在代碼示例部分,我們演示了如何使用線程池和進(jìn)程池來執(zhí)行多個(gè)任務(wù),其中包括下載多個(gè)文件的示例。通過比較兩種方式執(zhí)行任務(wù)所花費(fèi)的時(shí)間,我們可以更好地了解它們?cè)诓煌瑘?chǎng)景下的優(yōu)劣勢(shì)。

此外,文章還提供了一些并發(fā)編程中的注意事項(xiàng)和最佳實(shí)踐,包括共享資源的同步、內(nèi)存消耗與上下文切換、異常處理與任務(wù)超時(shí)等。這些建議有助于開發(fā)者編寫高效、穩(wěn)定的并發(fā)程序,提高程序的執(zhí)行效率和性能。

總的來說,線程池和進(jìn)程池是Python中強(qiáng)大的工具,能夠幫助開發(fā)者輕松實(shí)現(xiàn)并發(fā)編程,并充分利用計(jì)算資源。選擇合適的并發(fā)編程方式,并結(jié)合實(shí)際場(chǎng)景和任務(wù)特點(diǎn),可以編寫出高效、可靠的并發(fā)程序,提升應(yīng)用的性能和用戶體驗(yàn)。

鏈接:https://www.cnblogs.com/huaweiyun/p/18243386

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

    關(guān)注

    10

    文章

    1956

    瀏覽量

    36674
  • 多線程
    +關(guān)注

    關(guān)注

    0

    文章

    279

    瀏覽量

    20447
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4827

    瀏覽量

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

    關(guān)注

    0

    文章

    14

    瀏覽量

    2697

原文標(biāo)題:一文帶你搞清楚Python的多線程和多進(jìn)程

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    請(qǐng)問如何在Python實(shí)現(xiàn)多線程多進(jìn)程的協(xié)作?

    大家好!我最近在開發(fā)一個(gè)Python項(xiàng)目時(shí),需要同時(shí)處理多個(gè)任務(wù),且每個(gè)任務(wù)需要不同的計(jì)算資源。我想通過多線程多進(jìn)程的組合來實(shí)現(xiàn)并發(fā),但遇到了一些問題。 具體來說,我有兩個(gè)任務(wù),一個(gè)是I/O密集型
    發(fā)表于 03-11 06:57

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

    )。不管是多進(jìn)程還是多線程,最終目標(biāo)都是實(shí)現(xiàn)并行執(zhí)行。 2、多線程的優(yōu)勢(shì)前些年多進(jìn)程多一些,近些年多線程開始用得多?,F(xiàn)代操作系統(tǒng)設(shè)計(jì)時(shí)考慮到
    發(fā)表于 11-30 14:06

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

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

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

    魚還是熊掌:淺談多進(jìn)程多線程的選擇關(guān)于多進(jìn)程多線程,教科書上最經(jīng)典的一句話是“進(jìn)程是資源分配的最小單位,
    發(fā)表于 08-24 07:38

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

    段可以干多件事,譬如可以邊吃飯邊看電視;在Python多線程 和 協(xié)程 雖然是嚴(yán)格上來說是串行,但卻比一般的串行程序執(zhí)行效率高得很。 一般的串行程序,在程序阻塞的時(shí)候,只能干等著,不能去做其他事
    發(fā)表于 03-15 16:42

    LINUX系統(tǒng)下多線程多進(jìn)程性能分析

    采用多進(jìn)程處理多個(gè)任務(wù),會(huì)占用很多系統(tǒng)資源(主要是CPU 和內(nèi)存的使用)。在LINUX ,則對(duì)這種弊端進(jìn)行了改進(jìn),在用戶態(tài)實(shí)現(xiàn)了多線程處理多任務(wù)。本文系統(tǒng)論述了多線程
    發(fā)表于 08-13 08:31 ?20次下載

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

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

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

    關(guān)于多進(jìn)程多線程,教科書上最經(jīng)典的一句話是“進(jìn)程是資源分配的最小單位,線程是CPU調(diào)度的最小單位”,這句話應(yīng)付考試基本上夠了,但如果在工作
    的頭像 發(fā)表于 05-11 16:16 ?3181次閱讀
    如何選好<b class='flag-5'>多線程</b>和<b class='flag-5'>多進(jìn)程</b>

    多進(jìn)程多線程的深度比較

    嵌入式Linux中文站,關(guān)于多進(jìn)程多線程,教科書上最經(jīng)典的一句話是“進(jìn)程是資源分配的最小單位,線程是CPU調(diào)度的最小單位”。這句話應(yīng)付考試基本上夠了,但如果在工作
    發(fā)表于 04-02 14:42 ?626次閱讀

    多進(jìn)程多線程的基本概念

    ,或支持Hyper-threading的CPU上使用多線程程序設(shè)計(jì)的好處是顯而易見,即提高了程序的執(zhí)行吞吐率。在單CPU單核的計(jì)算機(jī)上,使用多線程技術(shù),也可以把進(jìn)程負(fù)責(zé)IO處理、人機(jī)
    發(fā)表于 04-02 14:49 ?862次閱讀

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

    Python 多進(jìn)程 (Multiprocessing) 是一種同時(shí)利用計(jì)算機(jī)多個(gè)處理器核心 (CPU cores) 進(jìn)行并行處理的技術(shù),它與 Python多線程 (Multith
    的頭像 發(fā)表于 04-26 11:04 ?783次閱讀

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

    在Linux網(wǎng)絡(luò)編程,我們應(yīng)該見過很多網(wǎng)絡(luò)框架或者server,有多進(jìn)程的處理方式,也有多線程處理方式,孰好孰壞并沒有可比性,首先選擇多進(jìn)程還是
    發(fā)表于 08-08 16:56 ?1079次閱讀
    淺談Linux網(wǎng)絡(luò)編程<b class='flag-5'>中</b>的<b class='flag-5'>多進(jìn)程</b>和<b class='flag-5'>多線程</b>

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

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

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

    關(guān)于多進(jìn)程多線程,教科書上最經(jīng)典的一句話是“進(jìn)程是資源分配的最小單位,線程是CPU調(diào)度的最小單位”,這句話應(yīng)付考試基本上夠了,但如果在工作
    的頭像 發(fā)表于 11-10 10:54 ?1875次閱讀
    Linux系統(tǒng)上<b class='flag-5'>多線程</b>和<b class='flag-5'>多進(jìn)程</b>的運(yùn)行效率

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

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