<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
該章節我們來學習一下在 Python 中去建立並使用多程序的方法,通過學習該章節,我們將可以通過建立多個程序來幫助我們提高指令碼執行的效率。可以認為縮短指令碼執行的時間,就是提高執行我們指令碼的效率。接下來讓我們都看一下今天的章節知識點都有哪些?
函數名 | 介紹 | 引數 | 返回值 |
---|---|---|---|
Process | 建立一個程序 | target, args | 程序物件 |
Process功能介紹:範例化一個物件;它需要傳入兩個引數 target 與 args:target 是一個函數,args 是對應一個函數的引數(args引數是一個元組)。其實我們可以這樣去理解,在一個指令碼中建立子程序,目的是為了讓它執行我們指令碼中的某個函數。換句話講,我們將指令碼中的某一個函數單獨的啟用一個程序去執行。
我們說過程序之間互不干擾,可以同時執行。所以我們可以認為主程序中的程式和子程序的函數是相互不干擾的,聽起來可能很難理解,一會兒下文我們進行一個案例的小練習,一遍幫助大家去更好的理解其中的含義。
函數名 | 介紹 | 引數 | 返回值 |
---|---|---|---|
start | 執行程序 | 無 | 無 |
join | 阻塞程序 | 無 | 無 |
kill | 殺死程序 | 無 | 無 |
is_alive | 判斷程序是否存活 | 無 | bool |
演示案例:
# coding:utf-8 import time import os def work_for_first(): for i in range(5): print(''work_for_first' 函數的迴圈值:%s', '程序號為:%s' % i, os.getpid()) # os.getpid() 為獲取程序號函數 time.sleep(1) def work_for_second(): for i in range(5): print(''work_for_second' 函數的迴圈值:%s', '程序號為:%s' % i, os.getpid()) time.sleep(1) if __name__ == '__main__': start_time = time.time() # 獲取執行 迴圈 之前的時間戳 work_for_first() work_for_second() end_time = time.time() - start_time # 獲取執行 迴圈 結束的時間戳 print('耗時時間為:{}, 程序號為:{}'.format(end_time, os.getpid())) # 獲取耗時與程序號
執行結果如下圖:
OKK!接下來進入我們今天要學習的主題。
將 work_for_first() 函數建立一個新的子程序去執行。
# coding:utf-8 import time import os import multiprocessing def work_for_first(): for i in range(5): print(''work_for_first' 函數的迴圈值:{},程序號為:{}'.format(i, os.getpid())) time.sleep(1) def work_for_second(): for i in range(5): print(''work_for_second' 函數的迴圈值:{},程序號為:{}'.format(i, os.getpid())) time.sleep(1) if __name__ == '__main__': start_time = time.time() # 獲取執行 迴圈 之前的時間戳 work_for_first_process = multiprocessing.Process(target=work_for_first) # 因為我們傳入的函數沒有引數所以 args 可以不寫 work_for_first_process.start() work_for_second() end_time = time.time() - start_time # 獲取執行 迴圈 結束的時間戳 print('耗時時間為:{}, 程序號為:{}'.format(end_time, os.getpid())) # 獲取耗時與程序號
執行結果如下圖:
因為我們針對 work_for_first() 函數建立一個新的子程序去執行,所以我們的耗時變為了 5秒。那麼如果我們將 work_for_second() 函數也建立一個新的子程序去執行,耗時又會是多少呢?我們接著往下看。
# coding:utf-8 import time import os import multiprocessing def work_for_first(): for i in range(5): print(''work_for_first' 函數的迴圈值:{},程序號為:{}'.format(i, os.getpid())) time.sleep(1) def work_for_second(): for i in range(5): print(''work_for_second' 函數的迴圈值:{},程序號為:{}'.format(i, os.getpid())) time.sleep(1) if __name__ == '__main__': start_time = time.time() # 獲取執行 迴圈 之前的時間戳 work_for_first_process = multiprocessing.Process(target=work_for_first) # 因為我們傳入的函數沒有引數所以 args 可以不寫 work_for_first_process.start() work_for_second_process = multiprocessing.Process(target=work_for_second) work_for_second_process.start() end_time = time.time() - start_time # 獲取執行 迴圈 結束的時間戳 print('耗時時間為:{}, 程序號為:{}'.format(end_time, os.getpid())) # 獲取耗時與程序號
執行結果如下圖:
PS:從指令碼中執行入口的 main 函數可以看出 work_for_first() 函數 與 work_for_second() 函數 分別都由各自的子程序來執行,主程序實際執行的 只有 23行、29行、30行程式碼,所以從耗時來看,主程序實際上只執行了 0.026 秒。
這裡再思考一個問題,如果是每一個子程序都單獨的通過 .start 去啟動,那麼在子程序很多的情況下,啟動的確實會有一些慢了。這個時候我們就可以通過 for 迴圈的方式去啟動子程序。方式如下:
for sun_process in (work_for_first_process, work_for_second_process): sun_process.start()
同樣的也會存在著這樣一種情況,我們希望子程序執行結束之後再去執行我們的主程序,這時候我們就會使用到 join 函數 。
這裡我們就利用上文的 程序 for迴圈同時啟動兩個子程序,然後我們再在下一個 for迴圈 執行 join 函數,我們看看會發生什麼。
# coding:utf-8 import time import os import multiprocessing def work_for_first(): for i in range(5): print(''work_for_first' 函數的迴圈值:{},程序號為:{}'.format(i, os.getpid())) time.sleep(1) def work_for_second(): for i in range(5): print(''work_for_second' 函數的迴圈值:{},程序號為:{}'.format(i, os.getpid())) time.sleep(1) if __name__ == '__main__': start_time = time.time() # 獲取執行 迴圈 之前的時間戳 work_for_first_process = multiprocessing.Process(target=work_for_first) # 因為我們傳入的函數沒有引數所以 args 可以不寫 # work_for_first_process.start() work_for_second_process = multiprocessing.Process(target=work_for_second) # work_for_second_process.start() for sun_process in (work_for_first_process, work_for_second_process): sun_process.start() for sun_process in (work_for_first_process, work_for_second_process): sun_process.join() end_time = time.time() - start_time # 獲取執行 迴圈 結束的時間戳 print('耗時時間為:{}, 程序號為:{}'.format(end_time, os.getpid())) # 獲取耗時與程序號
執行結果如下圖:
接下來我們再嘗試一個場景,利用 for 迴圈,我們同時啟動 work_for_first() 函數 與 work_for_second() 函數 的子程序。然後我們再在另一個 for 迴圈中,將 work_for_second() 函數 的子程序 kill 掉,然後判斷兩個子程序的存活狀態。
範例指令碼如下:
# coding:utf-8 import time import os import multiprocessing def work_for_first(): for i in range(5): print(''work_for_first' 函數的迴圈值:{},程序號為:{}'.format(i, os.getpid())) time.sleep(1) def work_for_second(): for i in range(5): print(''work_for_second' 函數的迴圈值:{},程序號為:{}'.format(i, os.getpid())) time.sleep(1) if __name__ == '__main__': start_time = time.time() # 獲取執行 迴圈 之前的時間戳 work_for_first_process = multiprocessing.Process(target=work_for_first) # 因為我們傳入的函數沒有引數所以 args 可以不寫 # work_for_first_process.start() work_for_second_process = multiprocessing.Process(target=work_for_second) # work_for_second_process.start() for sun_process in (work_for_first_process, work_for_second_process): sun_process.start() time.sleep(1) # 休眠一秒是為了 work_for_second_process 子程序 至少能夠執行一次 for sun_process in (work_for_first_process, work_for_second_process): work_for_second_process.kill() if work_for_first_process.is_alive(): print(''work_for_first_process' 子程序當前存活狀態為:True') elif not work_for_second_process.is_alive(): print(''work_for_second_process' 子程序當前存活狀態為:False') sun_process.join() end_time = time.time() - start_time # 獲取執行 迴圈 結束的時間戳 print('耗時時間為:{}, 程序號為:{}'.format(end_time, os.getpid())) # 獲取耗時與程序號
執行結果如下:
通過學習多程序的建立、啟動,我們可以充分的體會到程序給我們帶來的好處。它可以使我們的指令碼程式執行時間進行縮短,從而提高工作效率。
然而多程序也有一些問題:
關於程序的這些問題,其實也並不是不能解決。在後續更新的 程序間的通訊 、程序池與程序鎖 的章節我們再進行詳細的介紹。
到此這篇關於Python語法學習之程序的建立與常用方法詳解的文章就介紹到這了,更多相關Python 程序建立內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45