AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

Python編程進(jìn)階,輕松掌握多線程和多進(jìn)程

來源: 責(zé)編: 時(shí)間:2023-12-12 17:03:04 327觀看
導(dǎo)讀1、簡介我們將討論如何利用Python執(zhí)行多線程和多進(jìn)程任務(wù)。它們提供了在單個進(jìn)程或多個進(jìn)程之間執(zhí)行并發(fā)操作的方法。并行和并發(fā)執(zhí)行可以提高系統(tǒng)的速度和效率。在討論多線程和多進(jìn)程的基礎(chǔ)知識之后,我們還將討論使用P

1、簡介

我們將討論如何利用Python執(zhí)行多線程和多進(jìn)程任務(wù)。它們提供了在單個進(jìn)程或多個進(jìn)程之間執(zhí)行并發(fā)操作的方法。并行和并發(fā)執(zhí)行可以提高系統(tǒng)的速度和效率。RVa28資訊網(wǎng)——每日最新資訊28at.com

在討論多線程和多進(jìn)程的基礎(chǔ)知識之后,我們還將討論使用Python庫實(shí)現(xiàn)它們的實(shí)際方法。RVa28資訊網(wǎng)——每日最新資訊28at.com

首先簡要討論并行系統(tǒng)的好處。RVa28資訊網(wǎng)——每日最新資訊28at.com

  1. 改進(jìn)的性能:有了并發(fā)執(zhí)行任務(wù)的能力,可以減少執(zhí)行時(shí)間并提高系統(tǒng)的整體性能。
  2. 可擴(kuò)展性:可以將一個大任務(wù)分解為多個較小的子任務(wù),并為它們分配獨(dú)立的核心或線程,讓它們獨(dú)立執(zhí)行。這在大規(guī)模系統(tǒng)中非常有用。
  3. 高效的I/O操作:通過并發(fā)的幫助,CPU不必等待進(jìn)程完成其I/O操作。CPU可以立即開始執(zhí)行下一個進(jìn)程,直到前一個進(jìn)程忙于其I/O操作。
  4. 資源優(yōu)化:通過分割資源,可以防止單個進(jìn)程占用所有資源。這可以避免較小進(jìn)程的Starvation(饑餓)問題。

并行計(jì)算的優(yōu)勢并行計(jì)算的優(yōu)勢RVa28資訊網(wǎng)——每日最新資訊28at.com

以上是需要并發(fā)或并行執(zhí)行的一些常見原因。現(xiàn)在,回到主題,即多線程和多進(jìn)程,并討論它們的主要區(qū)別。RVa28資訊網(wǎng)——每日最新資訊28at.com

2、什么是多線程?

多線程是在單個進(jìn)程中實(shí)現(xiàn)并行性的一種方法,能夠執(zhí)行同時(shí)進(jìn)行的任務(wù)。在單個進(jìn)程內(nèi)可以創(chuàng)建多個線程,并在該進(jìn)程內(nèi)并行執(zhí)行較小的任務(wù)。RVa28資訊網(wǎng)——每日最新資訊28at.com

單個進(jìn)程中的線程共享一個公共內(nèi)存空間,但它們的堆棧跟蹤和寄存器是獨(dú)立的。由于共享內(nèi)存,它們的計(jì)算成本較低。RVa28資訊網(wǎng)——每日最新資訊28at.com

單線程和多線程Env.單線程和多線程Env.RVa28資訊網(wǎng)——每日最新資訊28at.com

Python中的多線程主要用于執(zhí)行I/O操作,即如果程序的某個部分正在執(zhí)行I/O操作,則其余程序可以保持響應(yīng)。然而,在Python的實(shí)現(xiàn)中,由于全局解釋器鎖(GIL)的存在,多線程無法實(shí)現(xiàn)真正的并行性。RVa28資訊網(wǎng)——每日最新資訊28at.com

簡而言之,GIL是一個互斥鎖,一次只允許一個線程與Python字節(jié)碼交互,即使在多線程模式下,一次也只能有一個線程執(zhí)行字節(jié)碼。RVa28資訊網(wǎng)——每日最新資訊28at.com

這樣做是為了在CPython中保持線程安全,但它限制了多線程的性能優(yōu)勢。為了解決這個問題,Python有一個單獨(dú)的多進(jìn)程庫,我們將在之后進(jìn)行討論。RVa28資訊網(wǎng)——每日最新資訊28at.com

什么是守護(hù)線程?

不斷在后臺運(yùn)行的線程稱為守護(hù)線程。它們的主要工作是支持主線程或非守護(hù)線程。守護(hù)線程不會阻塞主線程的執(zhí)行,甚至?xí)谥骶€程執(zhí)行完畢后繼續(xù)運(yùn)行。RVa28資訊網(wǎng)——每日最新資訊28at.com

在Python中,守護(hù)線程主要用作垃圾回收器。它會默認(rèn)銷毀所有無用的對象并釋放內(nèi)存,以便主線程可以正常使用和執(zhí)行。RVa28資訊網(wǎng)——每日最新資訊28at.com

3、什么是多進(jìn)程?

多進(jìn)程用于執(zhí)行多個進(jìn)程的并行執(zhí)行。它可以幫助實(shí)現(xiàn)真正的并行性,因?yàn)榭梢酝瑫r(shí)執(zhí)行不同的進(jìn)程,并且每個進(jìn)程都擁有自己的內(nèi)存空間。它使用CPU的獨(dú)立核心,并且在執(zhí)行進(jìn)程間的數(shù)據(jù)交換時(shí)也很有幫助。RVa28資訊網(wǎng)——每日最新資訊28at.com

與多線程相比,多進(jìn)程的計(jì)算成本更高,因?yàn)椴皇褂霉蚕韮?nèi)存空間。不過,它允許進(jìn)行獨(dú)立執(zhí)行,并克服了全局解釋器鎖的限制。RVa28資訊網(wǎng)——每日最新資訊28at.com

多進(jìn)程環(huán)境多進(jìn)程環(huán)境RVa28資訊網(wǎng)——每日最新資訊28at.com

上圖展示了一個多進(jìn)程環(huán)境,在該環(huán)境中,一個主進(jìn)程創(chuàng)建了兩個獨(dú)立的進(jìn)程,并為它們分配了不同的工作。RVa28資訊網(wǎng)——每日最新資訊28at.com

4、多線程實(shí)現(xiàn)

現(xiàn)在,我們使用Python實(shí)現(xiàn)一個基本的多線程示例。Python有一個內(nèi)置的threading模塊用于多線程實(shí)現(xiàn)。RVa28資訊網(wǎng)——每日最新資訊28at.com

  1. 導(dǎo)入庫:
import threadingimport os
  1. 計(jì)算平方的函數(shù):

這是一個用于計(jì)算數(shù)字平方的簡單函數(shù),它接受一個數(shù)字列表作為輸入,并輸出列表中每個數(shù)字的平方,同時(shí)輸出使用的線程名稱和與該線程關(guān)聯(lián)的進(jìn)程ID。RVa28資訊網(wǎng)——每日最新資訊28at.com

def calculate_squares(numbers):    for num in numbers:        square = num * num        print(            f"Square of the number {num} is {square} | Thread Name {threading.current_thread().name} | PID of the process {os.getpid()}"        )
  1. 主函數(shù):

本示例有一個數(shù)字列表,將其平均分成兩半,并分別命名為first_half和second_half。現(xiàn)在,將為這些列表分配兩個獨(dú)立的線程t1和t2。RVa28資訊網(wǎng)——每日最新資訊28at.com

Thread函數(shù)創(chuàng)建一個新線程,該線程接受一個帶有參數(shù)列表的函數(shù)作為輸入。還可以為線程分配一個單獨(dú)的名稱。RVa28資訊網(wǎng)——每日最新資訊28at.com

.start()函數(shù)將開始執(zhí)行這些線程,而.join()函數(shù)將阻塞主線程的執(zhí)行,直到給定的線程完全執(zhí)行完畢。RVa28資訊網(wǎng)——每日最新資訊28at.com

if __name__ == "__main__":    numbers = [1, 2, 3, 4, 5, 6, 7, 8]    half = len(numbers) // 2    first_half = numbers[:half]    second_half = numbers[half:]    t1 = threading.Thread(target=calculate_squares, name="t1", args=(first_half,))    t2 = threading.Thread(target=calculate_squares, name="t2", args=(second_half,))    t1.start()    t2.start()    t1.join()    t2.join()

輸出:RVa28資訊網(wǎng)——每日最新資訊28at.com

Square of the number 1 is 1 | Thread Name t1 | PID of the process 345Square of the number 2 is 4 | Thread Name t1 | PID of the process 345Square of the number 5 is 25 | Thread Name t2 | PID of the process 345Square of the number 3 is 9 | Thread Name t1 | PID of the process 345Square of the number 6 is 36 | Thread Name t2 | PID of the process 345Square of the number 4 is 16 | Thread Name t1 | PID of the process 345Square of the number 7 is 49 | Thread Name t2 | PID of the process 345Square of the number 8 is 64 | Thread Name t2 | PID of the process 345

注意:上述創(chuàng)建的所有線程都是非守護(hù)線程。要創(chuàng)建守護(hù)線程,需要編寫t1.setDaemon(True),將線程t1設(shè)置為守護(hù)線程。RVa28資訊網(wǎng)——每日最新資訊28at.com

現(xiàn)在來了解一下上述代碼生成的輸出結(jié)果。可以觀察到兩個線程的進(jìn)程ID(即PID)保持不變,這意味著這兩個線程屬于同一個進(jìn)程。RVa28資訊網(wǎng)——每日最新資訊28at.com

還可以觀察到輸出并非按順序生成。第一行中可以看到是線程1生成的輸出,然后在第三行是線程2生成的輸出,接著在第四行,再次是線程1生成的輸出。這清楚地表明這些線程是同時(shí)工作的。RVa28資訊網(wǎng)——每日最新資訊28at.com

并發(fā)并不意味著這兩個線程并行執(zhí)行,因?yàn)橐淮沃挥幸粋€線程被執(zhí)行。它不會減少執(zhí)行時(shí)間,與順序執(zhí)行所需的時(shí)間相同。CPU開始執(zhí)行一個線程,但在中途離開,并切換到另一個線程,過一段時(shí)間后,又回到主線程,并從上次離開的地方開始執(zhí)行。RVa28資訊網(wǎng)——每日最新資訊28at.com

5、多進(jìn)程實(shí)現(xiàn)

目前對多線程及其實(shí)現(xiàn)方式和限制已經(jīng)有基本的了解。現(xiàn)在,是時(shí)候?qū)W習(xí)多進(jìn)程的實(shí)現(xiàn)以及如何克服這些限制了。RVa28資訊網(wǎng)——每日最新資訊28at.com

在這里將沿用相同的示例,但不再創(chuàng)建兩個獨(dú)立的線程,而是創(chuàng)建兩個獨(dú)立的進(jìn)程,并討論觀察結(jié)果。RVa28資訊網(wǎng)——每日最新資訊28at.com

  1. 導(dǎo)入庫:
from multiprocessing import Processimport os

本例將使用multiprocessing模塊來創(chuàng)建獨(dú)立的進(jìn)程。RVa28資訊網(wǎng)——每日最新資訊28at.com

  1. 計(jì)算平方的函數(shù):

該函數(shù)將保持不變。只是在這里刪除了有關(guān)線程信息的打印語句。RVa28資訊網(wǎng)——每日最新資訊28at.com

def calculate_squares(numbers):    for num in numbers:        square = num * num        print(            f"Square of the number {num} is {square} | PID of the process {os.getpid()}"        )
  1. 主函數(shù):

主函數(shù)有一些修改。只是創(chuàng)建了一個獨(dú)立的進(jìn)程,而不是線程。RVa28資訊網(wǎng)——每日最新資訊28at.com

if __name__ == "__main__":    numbers = [1, 2, 3, 4, 5, 6, 7, 8]    half = len(numbers) // 2    first_half = numbers[:half]    second_half = numbers[half:]    p1 = Process(target=calculate_squares, args=(first_half,))    p2 = Process(target=calculate_squares, args=(second_half,))    p1.start()    p2.start()    p1.join()    p2.join()

輸出:RVa28資訊網(wǎng)——每日最新資訊28at.com

Square of the number 1 is 1 | PID of the process 1125Square of the number 2 is 4 | PID of the process 1125Square of the number 3 is 9 | PID of the process 1125Square of the number 4 is 16 | PID of the process 1125Square of the number 5 is 25 | PID of the process 1126Square of the number 6 is 36 | PID of the process 1126Square of the number 7 is 49 | PID of the process 1126Square of the number 8 is 64 | PID of the process 1126

可以觀察到,每個列表都由一個獨(dú)立的進(jìn)程執(zhí)行。它們具有不同的進(jìn)程ID。為了檢查進(jìn)程是否已并行執(zhí)行,需要創(chuàng)建一個單獨(dú)的環(huán)境,下面我們將討論這一點(diǎn)。RVa28資訊網(wǎng)——每日最新資訊28at.com

計(jì)算是否使用多進(jìn)程的運(yùn)行時(shí)間

為了檢查是否獲得了真正的并行性,在這里將計(jì)算使用和不使用多進(jìn)程的算法運(yùn)行時(shí)間。RVa28資訊網(wǎng)——每日最新資訊28at.com

為此,需要一個包含超過10^6個整數(shù)的大型整數(shù)列表。可以使用random庫生成一個列表。此處將使用Python的time模塊來計(jì)算運(yùn)行時(shí)間。下面是實(shí)現(xiàn)的代碼,代碼本身很容易理解,也可以隨時(shí)查看代碼注釋。RVa28資訊網(wǎng)——每日最新資訊28at.com

from multiprocessing import Processimport osimport timeimport randomdef calculate_squares(numbers):    for num in numbers:        square = num * numif __name__ == "__main__":    numbers = [        random.randrange(1, 50, 1) for i in range(10000000)    ]  # 創(chuàng)建一個包含10^7個整數(shù)的隨機(jī)列表。    half = len(numbers) // 2    first_half = numbers[:half]    second_half = numbers[half:]    # ----------------- 創(chuàng)建單進(jìn)程環(huán)境 ------------------------#    start_time = time.time()  # 開始計(jì)時(shí)(不使用多進(jìn)程)    p1 = Process(        target=calculate_squares, args=(numbers,)    )  # 單進(jìn)程P1執(zhí)行整個列表    p1.start()    p1.join()    end_time = time.time()  # 結(jié)束計(jì)時(shí)(不使用多進(jìn)程)    print(f"Execution Time Without Multiprocessing: {(end_time-start_time)*10**3}ms")    # ----------------- 創(chuàng)建多進(jìn)程環(huán)境 ------------------------#    start_time = time.time()  # 開始計(jì)時(shí)(使用多進(jìn)程)    p2 = Process(target=calculate_squares, args=(first_half,))    p3 = Process(target=calculate_squares, args=(second_half,))    p2.start()    p3.start()    p2.join()    p3.join()    end_time = time.time()  # 結(jié)束計(jì)時(shí)(使用多進(jìn)程)    print(f"Execution Time With Multiprocessing: {(end_time-start_time)*10**3}ms")

輸出:RVa28資訊網(wǎng)——每日最新資訊28at.com

Execution Time Without Multiprocessing: 619.8039054870605msExecution Time With Multiprocessing: 321.70287895202637ms

可以觀察到,使用多進(jìn)程的時(shí)間幾乎是不使用多進(jìn)程時(shí)間的一半。這表明這兩個進(jìn)程在同一時(shí)間內(nèi)并行執(zhí)行,并展示了真正的并行性行為。RVa28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-43333-0.htmlPython編程進(jìn)階,輕松掌握多線程和多進(jìn)程

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 如何優(yōu)雅地觀察 Vue.js 3 中 localStorage 的變化?

下一篇: 應(yīng)對全球業(yè)務(wù)持續(xù)增長,慧榮科技宣布新組織架構(gòu)

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 紅魔電競平板評測:大屏幕硬實(shí)力

    前言:三年的疫情因?yàn)橐暇W(wǎng)課的原因激活了平板市場,如今網(wǎng)課的時(shí)代已經(jīng)過去,大家的生活都恢復(fù)到了正軌,這也就意味著,真正考驗(yàn)平板電腦生存的環(huán)境來了。也就是面對著這種殘酷的
  • CSS單標(biāo)簽實(shí)現(xiàn)轉(zhuǎn)轉(zhuǎn)logo

    轉(zhuǎn)轉(zhuǎn)品牌升級后更新了全新的Logo,今天我們用純CSS來實(shí)現(xiàn)轉(zhuǎn)轉(zhuǎn)的新Logo,為了有一定的挑戰(zhàn)性,這里我們只使用一個標(biāo)簽實(shí)現(xiàn),將最大化的使用CSS能力完成Logo的繪制與動畫效果。新logo
  • 如何通過Python線程池實(shí)現(xiàn)異步編程?

    線程池的概念和基本原理線程池是一種并發(fā)處理機(jī)制,它可以在程序啟動時(shí)創(chuàng)建一組線程,并將它們置于等待任務(wù)的狀態(tài)。當(dāng)任務(wù)到達(dá)時(shí),線程池中的某個線程會被喚醒并執(zhí)行任務(wù),執(zhí)行完任
  • 最“俊美”淘寶賣家,靠直播和短視頻圈粉,上架秒光,年銷3000萬

    來源 | 電商在線文|易琬玉編輯|斯問受訪店鋪:Ringdoll戒之人形圖源:微博@御座的黃山、“Ringdoll戒之人形”淘寶店鋪有關(guān)外貌的評價(jià),黃山已經(jīng)聽累了。生于1985年的他,哪
  • ESG的面子與里子

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預(yù)警不絕,但處于厄爾尼諾大“烤”之下的除了眾生,還有各大企業(yè)發(fā)布的ESG報(bào)告。ESG是“環(huán)境保
  • 自研Exynos回歸!三星Galaxy S24系列將提供Exynos和驍龍雙版本

    年初,全新的三星Galaxy S23系列發(fā)布,包含Galaxy S23、Galaxy S23+和Galaxy S23 Ultra三個版本,全系搭載超頻版驍龍8 Gen 2,雖同樣采用臺積電4nm工藝制
  • 蘋果公司要求三星和LG Display生產(chǎn)「無邊框」OLED iPhone顯示屏

    據(jù) The Elec 報(bào)道,蘋果已要求其供應(yīng)商為未來的 iPhone 型號開發(fā)「無邊框」OLED 顯示面板。蘋果顯然已要求三星和 LG Display 開發(fā)新的 OLED 顯示面
  • AI藝術(shù)欣賞體驗(yàn)會在上海梅賽德斯奔馳中心音樂俱樂部上演

    光影交錯的鏡像世界,虛實(shí)幻化的視覺奇觀,虛擬偶像與真人共同主持,這些場景都出現(xiàn)在2019世界人工智能大會的舞臺上。8月29日至31日,“AI藝術(shù)欣賞體驗(yàn)會”在上海
  • “買真退假” 這種“羊毛”不能薅

    □ 法治日報(bào) 記者 王春   □ 本報(bào)通訊員 胡佳麗  2020年初,還在上大學(xué)的小東加入了一個大學(xué)生兼職QQ群。群主“七王”在群里介紹一些刷單賺
Top