python學習筆記之多程序

2022-09-26 16:09:18 字數 2481 閱讀 1837

我們現代的作業系統,都是支援「多工」的作業系統,對於操程式設計客棧作系統來說,乙個任務就是乙個程序(process)。比如開啟乙個瀏覽器就是啟動乙個瀏覽器程序。

如果我們將計算器的核心cpu比喻為一座工廠,那麼程序就像工廠裡的車間,它代表cpu所能處理的單個任務。任一時刻,cpu總是執行乙個程序,其他程序處於非執行狀態。

看到這大家可能會有一些疑問了,其他程序處於非執行狀態?可是我用瀏覽器訪問網頁的時候,****器明明也在執行啊。

實際上是作業系統輪流讓各個任務交替執行,任務1執行0.01秒,切換到任務2,任務2執行0.01秒,再切換到任務3,執行0.01秒……這樣反覆執行下去。表面上看,每個任務都是交替執行的,但是,由於cpu的執行速度實在是太快了,我們感覺就像所有任務都在同時執行一樣。

python中的多程序

在unix/linux作業系統中,可以使用fork()函式來建立。fork函式比其他普通函式有一點特殊之處,就是普通的函式呼叫,呼叫一次,返回一次,但是fork()呼叫一次,返回兩次,因為作業系統自動把當前程序(稱為父程序)複製了乙份(稱為子程序),然後,分別在父程序和子程序內返回。

子程序永遠返回0,而父程序返回子程序的id。這樣做的理由是,乙個父程序可以fork出很多子程序,所以,父程序要記下每個子程序的id,而子程序只需要呼叫getppid()就可以拿到父程序的id。

fork()函式被封裝在os模組中。接下來,我們舉例說明使用多程序和不使用多程序的區別:

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()

downl'mysql從刪庫到跑路.pdf')

download_task('萬萬沒想到.mp4')

end = time()

print('總共耗費了%.2f秒.' % (end - start))if __name__ == '__main__':

main()

執行結果:

開始**mysql從刪庫到跑路.pdf...

mysql從刪庫到跑路.pdf**完成! 耗費了9秒

開始**萬萬沒想到.mp4...

萬萬沒想到.mp4**完成! 耗費了9秒

總共耗費了18.00秒.

從上面的例子可以看出,如果程式中的**只能按順序一點點的往下執行,那麼即使執行兩個毫不相關的**任務,也需要先等待乙個檔案**完成後才能開始下乙個**任務,很顯然這並不合理也沒有效率。接下來我們使用多程序的方式將兩個**任務放到不同的程序中,**如下所示:

from multiprocessing import process

from os import getpid

from random import randint

from time import time, sleep

def download_task(filename):

print程式設計客棧('啟動**程序,程序號[%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=('www.cppcns.commysql從刪庫到跑路.pdf', ))

p1.start()

p2 = process(target=download_ args=('萬萬沒想到.mp4', ))

p2.start()

p1.join()

p2.join()

end = time()

print('總共耗費了%.2f秒.' % (end - start))

if __name__ == '__main__': main()

執行結果:

啟動**程序,程序號[568408].

開始**萬萬沒想到.mp4...萬萬沒想到.

mp4**完成! 耗費了6秒

啟動**程序,程序號[565896].

開始**mysql從刪庫到跑路.

pdf...mysql從刪庫到跑路.pdf**完成! 耗費了10秒

總共耗費了10.09秒.

執行上面的**可以明顯發現兩個**任務「同時」啟動了,而且程式的執行時間將大大縮短,不再是兩個任務的時間總和。

python學習之多程序

在介紹多程序之前,首先介紹下作業系統獲取關於程序中的一些資訊 方法描述 os.getpid 獲取當前程序的pid os.getppid 獲取當前程序的父程序的pid 在python中,我們一般都是通過引入multiprocessing模組來實現多程序程式設計,multiprocessing模組提供了...

python之多程序

要讓python實現多程序 multiprocessing 我們先來了解作業系統相關知識。unix 和 linux 作業系統提供了乙個 fork 函式系統呼叫,它非常特殊。普通的函式,呼叫一它次,執行一次,但是 fork 函式呼叫一次執行兩次,因為作業系統自動把當前程序 稱為父程序 複製了乙份 稱為...

Python學習之多程序例項

第一部分 任務分發端 usr bin env python coding utf 8 time 17 9 17 上午10 49 author mylovin file multiprocess server.py software pycharm 說明 多程序例項 分發任務端 匯入必備標頭檔案 im...