玩轉Python多線程【生長吧!Python】
前言:
這是我看了這位b站老師做的筆記,聽課完后覺得很簡單,感覺我這筆記還寫得有點啰嗦,線程和進程原理差不多,看了進程就可以跳著看線程了(反正我是這樣的,哈哈)
一. 多任務介紹
多任務:同一時間打開多個任務。比如一臺計算機上同時打開百度,和谷歌
并發 :在一段時間內 交替 去執行多個任務。比如對于單核cpu處理多任務,操作系統輪流讓各個任務交替執行
并行: 在一段時間內真正的同時一起 執行多個任務。
二. 進程
python中可以使用多進程 來實現多任務。
進程的概念:是資源的最小單位,,它是操作系統進行資源分配和調度運行的基本單位。通俗理解:一個正在運行的程序就是一個進程。例如qq等,都是一個進程
多進程作用
進程在python中的創建步驟:
#1. 導包 import multiprocessing #2. 通過進程類創建進程對象 進程對象=multiprocessing.Process(target=任務名) #3. 啟動進程執行任務 進程對象.start()
練習:
import multiprocessing import time #創建兩個任務 def sing(): for i in range(3): print('唱歌...') time.sleep(1.5) def dance(): for i in range(3): print('跳舞..') time.sleep(1.5) if __name__=='__main__':#main是主進程 #使用進程類創0建進程對象 #target指定執行函數名.記住:一定要指定 sing_process=multiprocessing.Process(target=sing) dance_process=multiprocessing.Process(target=dance) #使用進程對象啟動進程執行指定任務 sing_process.start() dance_process.start() '''輸出 唱歌... 跳舞.. 唱歌... 跳舞.. 唱歌... 跳舞.. '''
練習:將上面代碼3改為num
import multiprocessing import time #創建兩個任務 def sing(num): for i in range(num): print('唱歌...') time.sleep(1.5) def dance(): for i in range(num): print('跳舞..') time.sleep(1.5) if __name__=='__main__': sing_process=multiprocessing.Process(target=sing,args=(3,))#按照參數順序 dance_process=multiprocessing.Process(target=dance,kwargs={"num":2})#保證參數名一致就行 #使用進程對象啟動進程執行指定任務 sing_process.start() dance_process.start() ''' 跟上述代碼輸出一樣 '''
作用:當程序進程多時,沒辦法區分主進程和子進程,為了方便管理給每個進程設定編號
注意:需要導入os包
獲取當前進程編號:os.getpid
獲取父進程編號:os.getppid
import multiprocessing import time import os#導入os #創建兩個任務 def sing(): print('唱歌...') print("當前唱歌進程編號",os.getpid()) print("獲取父進程編號",os.getppid()) time.sleep(1.5) if __name__=='__main__': #使用進程類創0建進程對象 #target指定執行函數名.記住:一定要指定 print("當前主機進程編號",os.getpid()) sing_process=multiprocessing.Process(target=sing) #使用進程對象啟動進程執行指定任務 sing_process.start() '''輸出 當前主機進程編號 7744 唱歌... 當前唱歌進程編號 20328 獲取父進程編號 7744 '''
聽到守護,是不是想到你那個夜晚對呀發誓要守護她一生一世
這里的守護可不一樣
讓我們來看看守護進程是什么:
一般情況下,主進程會等待子進程執行完后在結束,那么如何設置主進程結束子進程也結束,不再執行代碼呢?
設置守護主進程方式:子進程對象.daemon=True
不多說,上代碼
import multiprocessing import time def work(): for i in range(10): print("工作中。。。") time.sleep(0.2) if __name__=='__main__': #創建子進程 sum_process=multiprocessing.Process(target=work) sum_process.daemon=True#設置守護主進程,主進程退出后子進程直接銷毀,不在執行 sum_process.start() time.sleep(1) print("主進程執行完成") '''輸出 工作中。。。 工作中。。。 工作中。。。 工作中。。。 工作中。。。 主進程執行完成 '''
你們可以去掉守護進程自己去試一下,后面還會運行子進程
三. 線程
在python中還可以使用多線程完成多任務
為什么使用
進程是分配資源的最小單位, 一旦創建一個進程就會分配一定的資源,就像跟兩個人聊QQ就需要打開兩個QQ軟件-樣是比較浪費資源的.
線程是程序執行的最小單位,實際上進程只負責分配資源,而利用這些資源執行程序的是線程,也就說進程是線程的容器,一個進程中最少有一個線程來負責執行程序.同時線程自己不擁有系統資源,只需要一點兒在運行中必不可少的資源,但它可與同屬一一個進程的其它線程共享進程所擁有的全部資源。這就像通過一個QQ軟件(一個進程)打開兩個窗口(兩個線程)跟兩個人聊天一樣,實現多任務的同時也節省了資源.
總結:
(1)線程是程序執行的最小單位.
(2)同屬一個進程的多個線程共享進程所擁有的全部資源.
導入線程模塊
import threading
通過線程類創建線程對象
線程對象=threading.Thread(target=任務名)
啟動線程執行任務
線程對象.start()
代碼實例
import threading import time #創建兩個任務 def sing(): for i in range(3): print('唱歌...') time.sleep(1.5) def dance(): for i in range(3): print('跳舞..') time.sleep(1.5) if __name__=='__main__': #使用進程類創0建進程對象 #target指定執行函數名.記住:一定要指定 sing_process=threading.Thread(target=sing) dance_process=threading.Thread(target=dance) #使用進程對象啟動進程執行指定任務 sing_process.start() dance_process.start()
代碼解析:跟進程不同,唱歌跳舞是同時出現的,遍歷了三次
主線程會等待所有的子線程執行結束再結束,除非設置子線程守護主線程
設置守護主線程有兩種方式:
(1)threading.Thread(target=work, daemon=True)
(2)線程對象.setDaemon(True)
差不多跟進程一樣,就不上代碼了
介紹:多進程執行時無序的,是由cpu調度決定某個線程先執行的
上代碼
import threading import time def task(): time.sleep(2) #current_thread():獲取當前線程的線程對象 thread=threading.current_thread() print(thread) if __name__== '__main__': for i in range(5): sub_thread=threading.Thread(target=task) sub_thread.start() '''輸出
我們可以看到,輸出的是23145,順序是被打亂的,所以多進程是無序的
四. 進程和線程對比
1.關系對比
(1)線程是依附于進程的,沒有進程就沒線程
(2)一個進程默認提供一條線程,進程可以創建多個線程
2. 區別對比
(1)創建進程開銷比線程大
(2)進程是操作系統資源分配的基本單位,線程是cpu調度的基本單位
(3)線程需要依附進程才可以運行
3. 優缺點對比
(1)線程可以用多核,進程不能
(2)開銷的大小
本人博客:https://blog.csdn.net/weixin_46654114
本人b站求關注:https://space.bilibili.com/391105864
轉載說明:跟我說明,務必注明來源,附帶本人博客連接。
【生長吧!Python】有獎征文火熱進行中:https://bbs.huaweicloud.com/blogs/278897
請給我點個贊鼓勵我吧
Python 任務調度 多線程
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。