帶小白學(xué)習(xí)如何使用Python教程-多進(jìn)程
今天馬哥教育要跟大家分享的文章是帶小白學(xué)習(xí)如何使用Python教程-多進(jìn)程?熟悉Python的小伙伴們都知道我們現(xiàn)代的操作系統(tǒng),都是支持“多任務(wù)”的操作系統(tǒng),對于操作系統(tǒng)來說,一個任務(wù)就是一個進(jìn)程(process)。Python入門新手和正在Python學(xué)習(xí)的小伙伴快來看一看吧,希望能夠?qū)Υ蠹矣兴鶐椭?!
如果我們將計算器的核心CPU比喻為一座工廠,那么進(jìn)程就像工廠里的車間,它代表CPU所能處理的單個任務(wù)。任一時刻,CPU總是運行一個進(jìn)程,其他進(jìn)程處于非運行狀態(tài)。
看到這大家可能會有一些疑問了,其他進(jìn)程處于非運行狀態(tài)?可是我用瀏覽器訪問網(wǎng)頁的時候,音樂播放器明明也在運行啊。
實際上是操作系統(tǒng)輪流讓各個任務(wù)交替執(zhí)行,任務(wù)1執(zhí)行0.01秒,切換到任務(wù)2,任務(wù)2執(zhí)行0.01秒,再切換到任務(wù)3,執(zhí)行0.01秒……這樣反復(fù)執(zhí)行下去。表面上看,每個任務(wù)都是交替執(zhí)行的,但是,由于CPU的執(zhí)行速度實在是太快了,我們感覺就像所有任務(wù)都在同時執(zhí)行一樣。
Python中的多進(jìn)程
在UNIX/LINUX操作系統(tǒng)中,可以使用fork()函數(shù)來創(chuàng)建。fork函數(shù)比其他普通函數(shù)有一點特殊之處,就是普通的函數(shù)調(diào)用,調(diào)用一次,返回一次,但是fork()調(diào)用一次,返回兩次,因為操作系統(tǒng)自動把當(dāng)前進(jìn)程(稱為父進(jìn)程)復(fù)制了一份(稱為子進(jìn)程),然后,分別在父進(jìn)程和子進(jìn)程內(nèi)返回。
子進(jìn)程永遠(yuǎn)返回0,而父進(jìn)程返回子進(jìn)程的ID。這樣做的理由是,一個父進(jìn)程可以fork出很多子進(jìn)程,所以,父進(jìn)程要記下每個子進(jìn)程的ID,而子進(jìn)程只需要調(diào)用getppid()就可以拿到父進(jìn)程的ID。
fork()函數(shù)被封裝在os模塊中。接下來,我們舉例說明使用多進(jìn)程和不使用多進(jìn)程的區(qū)別:
from random import randint from time import time, sleep def download_task(filename): print('開始下載%s...' % filename) time_to_download = randint(5, 10) sleep(time_to_download) print('%s下載完成! 耗費了%d秒' % (filename, time_to_download)) def main(): start = time() download_task('My執(zhí)行結(jié)果: 開始下載MySQL從刪庫到跑路.pdf... MySQL從刪庫到跑路.pdf下載完成! 耗費了9秒 開始下載萬萬沒想到.mp4... 萬萬沒想到.mp4下載完成! 耗費了9秒 總共耗費了18.00秒.從上面的例子可以看出,如果程序中的代碼只能按順序一點點的往下執(zhí)行,那么即使執(zhí)行兩個毫不相關(guān)的下載任務(wù),也需要先等待一個文件下載完成后才能開始下一個下載任務(wù),很顯然這并不合理也沒有效率。接下來我們使用多進(jìn)程的方式將兩個下載任務(wù)放到不同的進(jìn)程中,代碼如下所示:
from multiprocessing import Process from os import getpid from random import randint from time import time, sleep def download_task(filename): print('啟動下載進(jìn)程,進(jìn)程號[%d].' % getpid()) print('開始下載%s...' % filename) time_to_download = randint(5, 10) sleep(time_to_download) print('%s下載完成! 耗費了%d秒' % (filename, time_to_download)) def main(): start = time() p1 = Process(target=download_task, args=('MySQL從刪庫到跑路.pdf', )) p1.start() p2 = Process(target=download_task, args=('萬萬沒想到.mp4', )) p2.start() p1.join() p2.join() end = time() print('總共耗費了%.2f秒.' % (end - start)) if __name__ == '__main__': main()執(zhí)行結(jié)果: 啟動下載進(jìn)程,進(jìn)程號[568408]. 開始下載萬萬沒想到.mp4...萬萬沒想到. mp4下載完成! 耗費了6秒 啟動下載進(jìn)程,進(jìn)程號[565896]. 開始下載MySQL從刪庫到跑路. pdf...MySQL從刪庫到跑路.pdf下載完成! 耗費了10秒 總共耗費了10.09秒.運行上面的代碼可以明顯發(fā)現(xiàn)兩個下載任務(wù)“同時”啟動了,而且程序的執(zhí)行時間將大大縮短,不再是兩個任務(wù)的時間總和。
以上就是馬哥教育今天為大家分享的關(guān)于帶小白學(xué)習(xí)如何使用Python教程-多進(jìn)程的文章,希望本篇文章能夠?qū)φ?strong>Python學(xué)習(xí)和 從事Python相關(guān)工作的小伙伴們有所幫助,想要了解更多相關(guān)知識記得關(guān)注馬哥教育官網(wǎng)。最后祝愿小伙伴們工作順利!
免責(zé)聲明:內(nèi)容和圖片源自網(wǎng)絡(luò),版權(quán)歸原作者所有,如有侵犯您的原創(chuàng)版權(quán)請告知,我們將盡快刪除相關(guān)內(nèi)容。