亚洲熟女综合色一区二区三区,亚洲精品中文字幕无码蜜桃,亚洲va欧美va日韩va成人网,亚洲av无码国产一区二区三区,亚洲精品无码久久久久久久

零基礎(chǔ)Python教程-多進(jìn)程


我們現(xiàn)代的操作系統(tǒng),都是支持“多任務(wù)”的操作系統(tǒng),對于操作系統(tǒng)來說,一個(gè)任務(wù)就是一個(gè)進(jìn)程(process)。比如打開一個(gè)瀏覽器就是啟動(dòng)一個(gè)瀏覽器進(jìn)程。 今天馬哥教育為大家分享一篇零基礎(chǔ)Python教程多進(jìn)程!

如果我們將計(jì)算器的核心CPU比喻為一座工廠,那么進(jìn)程就像工廠里的車間,它代表CPU所能處理的單個(gè)任務(wù)。任一時(shí)刻,CPU總是運(yùn)行一個(gè)進(jìn)程,其他進(jìn)程處于非運(yùn)行狀態(tài)。

看到這大家可能會(huì)有一些疑問了,其他進(jìn)程處于非運(yùn)行狀態(tài)?可是我用瀏覽器訪問網(wǎng)頁的時(shí)候,音樂播放器明明也在運(yùn)行啊。

實(shí)際上是操作系統(tǒng)輪流讓各個(gè)任務(wù)交替執(zhí)行,任務(wù)1執(zhí)行0.01秒,切換到任務(wù)2,任務(wù)2執(zhí)行0.01秒,再切換到任務(wù)3,執(zhí)行0.01秒……這樣反復(fù)執(zhí)行下去。表面上看,每個(gè)任務(wù)都是交替執(zhí)行的,但是,由于CPU的執(zhí)行速度實(shí)在是太快了,我們感覺就像所有任務(wù)都在同時(shí)執(zhí)行一樣。

Python中的多進(jìn)程

在UNIX/LINUX操作系統(tǒng)中,可以使用fork()函數(shù)來創(chuàng)建。fork函數(shù)比其他普通函數(shù)有一點(diǎn)特殊之處,就是普通的函數(shù)調(diào)用,調(diào)用一次,返回一次,但是fork()調(diào)用一次,返回兩次,因?yàn)椴僮飨到y(tǒng)自動(dò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。這樣做的理由是,一個(gè)父進(jìn)程可以fork出很多子進(jìn)程,所以,父進(jìn)程要記下每個(gè)子進(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下載完成! 耗費(fèi)了%d秒' % (filename, time_to_download))

def main():

start = time()

download_task('My



執(zhí)行結(jié)果:

開始下載MySQL從刪庫到跑路.pdf...

MySQL從刪庫到跑路.pdf下載完成! 耗費(fèi)了9秒

開始下載萬萬沒想到.mp4...

萬萬沒想到.mp4下載完成! 耗費(fèi)了9秒

總共耗費(fèi)了18.00秒.

從上面的例子可以看出,如果程序中的代碼只能按順序一點(diǎn)點(diǎn)的往下執(zhí)行,那么即使執(zhí)行兩個(gè)毫不相關(guān)的下載任務(wù),也需要先等待一個(gè)文件下載完成后才能開始下一個(gè)下載任務(wù),很顯然這并不合理也沒有效率。接下來我們使用多進(jìn)程的方式將兩個(gè)下載任務(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('啟動(dòng)下載進(jìn)程,進(jìn)程號[%d].' % getpid()) print('開始下載%s...' % filename) time_to_download = randint(5, 10)

sleep(time_to_download)

print('%s下載完成! 耗費(fèi)了%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('總共耗費(fèi)了%.2f秒.' % (end - start))

if __name__ == '__main__': main()
執(zhí)行結(jié)果:

啟動(dòng)下載進(jìn)程,進(jìn)程號[568408].

開始下載萬萬沒想到.mp4...萬萬沒想到.

mp4下載完成! 耗費(fèi)了6秒

啟動(dòng)下載進(jìn)程,進(jìn)程號[565896].

開始下載MySQL從刪庫到跑路.

pdf...MySQL從刪庫到跑路.pdf下載完成! 耗費(fèi)了10秒

總共耗費(fèi)了10.09秒.

運(yùn)行上面的代碼可以明顯發(fā)現(xiàn)兩個(gè)下載任務(wù)“同時(shí)”啟動(dòng)了,而且程序的執(zhí)行時(shí)間將大大縮短,不再是兩個(gè)任務(wù)的時(shí)間總和。

以上就是馬哥教育為大家分享的內(nèi)容,希望大家能夠持續(xù)關(guān)注馬哥教育官網(wǎng),每天都會(huì)有優(yōu)質(zhì)內(nèi)容與大家分享歐!

聲明:文章來源于網(wǎng)絡(luò),侵刪!

相關(guān)新聞

歷經(jīng)多年發(fā)展,已成為國內(nèi)好評如潮的Linux云計(jì)算運(yùn)維、SRE、Devops、網(wǎng)絡(luò)安全、云原生、Go、Python開發(fā)專業(yè)人才培訓(xùn)機(jī)構(gòu)!