python學(xué)習(xí)筆記之多進(jìn)程
我們現(xiàn)代的操作系統(tǒng),都是支持“多任務(wù)”的操作系統(tǒng),對于操作系統(tǒng)來說,一個任務(wù)就是一個進(jìn)程(process)。比如打開一個瀏覽器就是啟動一個瀏覽器進(jìn)程。
如果我們將計(jì)算器的核心CPU比喻為一座工廠,那么進(jìn)程就像工廠里的車間,它代表CPU所能處理的單個任務(wù)。任一時刻,CPU總是運(yùn)行一個進(jìn)程,其他進(jìn)程處于非運(yùn)行狀態(tài)。
看到這大家可能會有一些疑問了,其他進(jìn)程處于非運(yùn)行狀態(tài)?可是我用瀏覽器訪問網(wǎng)頁的時候,音樂播放器明明也在運(yùn)行啊。
實(shí)際上是操作系統(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í)行速度實(shí)在是太快了,我們感覺就像所有任務(wù)都在同時執(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)前進(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下載完成! 耗費(fèi)了%d秒' % (filename, time_to_download))
def main():
start = time()
download_task('MySQL從刪庫到跑路.pdf')
download_task('萬萬沒想到.mp4')
end = time()
print('總共耗費(fèi)了%.2f秒.' % (end - start))if __name__ == '__main__':
main()
執(zhí)行結(jié)果:
開始下載MySQL從刪庫到跑路.pdf...
MySQL從刪庫到跑路.pdf下載完成! 耗費(fèi)了9秒
開始下載萬萬沒想到.mp4...
萬萬沒想到.mp4下載完成! 耗費(fèi)了9秒
總共耗費(fèi)了18.00秒.
從上面的例子可以看出,如果程序中的代碼只能按順序一點(diǎn)點(diǎn)的往下執(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下載完成! 耗費(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é)果:
啟動下載進(jìn)程,進(jìn)程號[568408].
開始下載萬萬沒想到.mp4...萬萬沒想到.
mp4下載完成! 耗費(fèi)了6秒
啟動下載進(jìn)程,進(jìn)程號[565896].
開始下載MySQL從刪庫到跑路.
pdf...MySQL從刪庫到跑路.pdf下載完成! 耗費(fèi)了10秒
總共耗費(fèi)了10.09秒.
運(yùn)行上面的代碼可以明顯發(fā)現(xiàn)兩個下載任務(wù)“同時”啟動了,而且程序的執(zhí)行時間將大大縮短,不再是兩個任務(wù)的時間總和。
以上就是python學(xué)習(xí)筆記之多進(jìn)程的詳細(xì)內(nèi)容,更多關(guān)于Python多進(jìn)程的資料請關(guān)注腳本之家其它相關(guān)文章!
- python并發(fā)編程之多進(jìn)程、多線程、異步和協(xié)程詳解
- 深入淺析python中的多進(jìn)程、多線程、協(xié)程
- python多進(jìn)程 主進(jìn)程和子進(jìn)程間共享和不共享全局變量實(shí)例
- Python多進(jìn)程編程常用方法解析
- Python多進(jìn)程multiprocessing、進(jìn)程池用法實(shí)例分析
- python3爬蟲中異步協(xié)程的用法
- Python手動或自動協(xié)程操作方法解析
- 淺談Python協(xié)程
- python 使用事件對象asyncio.Event來同步協(xié)程的操作
- python 多進(jìn)程和協(xié)程配合使用寫入數(shù)據(jù)
相關(guān)文章
基于Python組裝jmx并調(diào)用JMeter實(shí)現(xiàn)壓力測試
這篇文章主要介紹了基于Python組裝jmx并調(diào)用JMeter實(shí)現(xiàn)壓力測試,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11
Tensorflow 利用tf.contrib.learn建立輸入函數(shù)的方法
這篇文章主要介紹了Tensorflow 利用tf.contrib.learn建立輸入函數(shù)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02
Pytorch基礎(chǔ)教程之torchserve模型部署解析
torchserve是基于netty網(wǎng)絡(luò)框架實(shí)現(xiàn)的,底層使用EpollServerSocketChannel服務(wù)進(jìn)行網(wǎng)絡(luò)通信,通過epoll多路復(fù)用技術(shù)實(shí)現(xiàn)高并發(fā)網(wǎng)絡(luò)連接處理,這篇文章主要介紹了Pytorch基礎(chǔ)教程之torchserve模型部署和推理,需要的朋友可以參考下2023-07-07
Python守護(hù)進(jìn)程和腳本單例運(yùn)行詳解
本篇文章主要介紹了Python守護(hù)進(jìn)程和腳本單例運(yùn)行,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01
使用Python實(shí)現(xiàn)MongoDB數(shù)據(jù)轉(zhuǎn)表格文件CSV
這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)將MongoDB中的數(shù)據(jù)轉(zhuǎn)換為表格文件(如CSV)以便于數(shù)據(jù)交換、共享或?qū)氲狡渌到y(tǒng)進(jìn)行分析,需要的可以參考下2024-04-04
python中matplotlib實(shí)現(xiàn)最小二乘法擬合的過程詳解
這篇文章主要給大家介紹了關(guān)于python中matplotlib實(shí)現(xiàn)最小二乘法擬合的相關(guān)資料,文中通過示例代碼詳細(xì)介紹了關(guān)于最小二乘法擬合直線和最小二乘法擬合曲線的實(shí)現(xiàn)過程,需要的朋友可以參考借鑒,下面來一起看看吧。2017-07-07
對python中url參數(shù)編碼與解碼的實(shí)例詳解
今天小編就為大家分享一篇對python中url參數(shù)編碼與解碼的實(shí)例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
在tensorflow下利用plt畫論文中l(wèi)oss,acc等曲線圖實(shí)例
這篇文章主要介紹了在tensorflow下利用plt畫論文中l(wèi)oss,acc等曲線圖實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06

