Python---多任务介绍以及Thread的基本使用
多任務介紹
現實生活中
有很多的場景中的事情是同時進行的,比如開車的時候 手和腳共同來駕駛汽車,再比如唱歌跳舞也是同時進行的;
想,如果把唱歌和跳舞這2件事情分開依次完成的話,估計就沒有那么好的效果了(想一下場景:先唱歌,然后在跳舞,O(∩_∩)O哈哈~)
程序中
如下程序,來模擬“唱歌跳舞”這件事情
運行結果如下:
注意
-
很顯然剛剛的程序并沒有完成唱歌和跳舞同時進行的要求
-
如果想要實現“唱歌跳舞”同時進行,那么就需要一個新的方法,叫做:多任務
多任務的概念
什么叫“多任務”呢?簡單地說,就是操作系統可以同時運行多個任務。打個比方,你一邊在用瀏覽器上網,一邊在聽MP3,一邊在用Word趕作業,這就是多任務,至少同時有3個任務正在運行。還有很多任務悄悄地在后臺同時運行著,只是桌面上沒有顯示而已。
現在,多核CPU已經非常普及了,但是,即使過去的單核CPU,也可以執行多任務。由于CPU執行代碼都是順序執行的,那么,單核CPU是怎么執行多任務的呢?
答案就是操作系統輪流讓各個任務交替執行,任務1執行0.01秒,切換到任務2,任務2執行0.01秒,再切換到任務3,執行0.01秒……這樣反復執行下去。表面上看,每個任務都是交替執行的,但是,由于CPU的執行速度實在是太快了,我們感覺就像所有任務都在同時執行一樣。
真正的并行執行多任務只能在多核CPU上實現,但是,由于任務數量遠遠多于CPU的核心數量,所以,操作系統也會自動把很多任務輪流調度到每個核心上執行。
注意:
-
并發:指的是任務數多余cpu核數,通過操作系統的各種任務調度算法,實現用多個任務“一起”執行(實際上總有一些任務不在執行,因為切換任務的速度相當快,看上去一起執行而已)
-
并行:指的是任務數小于等于cpu核數,即任務真的是一起執行的
線程(重點)
python的thread模塊是比較底層的模塊,python的threading模塊是對thread做了一些包裝的,可以更加方便的被使用
1. 使用threading模塊
單線程執行
運行結果:
多線程執行
運行結果:
說明
-
可以明顯看出使用了多線程并發的操作,花費時間要短很多
-
當調用start()時,才會真正的創建線程,并且開始執行
2. 主線程會等待所有的子線程結束后才結束
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴, 互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' #coding=utf-8 import threading from time import sleep,ctimedef sing():for i in range(3):print("正在唱歌...%d"%i)sleep(1)def dance():for i in range(3):print("正在跳舞...%d"%i)sleep(1)if __name__ == '__main__':print('---開始---:%s'%ctime())t1 = threading.Thread(target=sing)t2 = threading.Thread(target=dance)t1.start()t2.start()#sleep(5) # 屏蔽此行代碼,試試看,程序是否會立馬結束?print('---結束---:%s'%ctime())
3. 查看線程數量
線程(注意點)
1. 線程執行代碼的封裝
通過上一小節,能夠看出,通過使用threading模塊能完成多任務的程序開發,為了讓每個線程的封裝性更完美,所以使用threading模塊時,往往會定義一個新的子類class,只要繼承threading.Thread就可以了,然后重寫run方法
示例如下:
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴, 互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' #coding=utf-8 import threading import timeclass MyThread(threading.Thread):def run(self):for i in range(3):time.sleep(1)msg = "I'm "+self.name+' @ '+str(i) #name屬性中保存的是當前線程的名字print(msg)if __name__ == '__main__':t = MyThread()t.start()
說明
python的threading.Thread類有一個run方法,用于定義線程的功能函數,可以在自己的線程類中覆蓋該方法。而創建自己的線程實例后,通過Thread類的start方法,可以啟動該線程,交給python虛擬機進行調度,當該線程獲得執行的機會時,就會調用run方法執行線程。
2. 線程的執行順序
''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴, 互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' #coding=utf-8 import threading import timeclass MyThread(threading.Thread):def run(self):for i in range(3):time.sleep(1)msg = "I'm "+self.name+' @ '+str(i)print(msg) def test():for i in range(5):t = MyThread()t.start() if __name__ == '__main__':test()執行結果:(運行的結果可能不一樣,但是大體是一致的)
I'm Thread-1 @ 0I'm Thread-2 @ 0I'm Thread-5 @ 0I'm Thread-3 @ 0I'm Thread-4 @ 0I'm Thread-3 @ 1I'm Thread-4 @ 1I'm Thread-5 @ 1I'm Thread-1 @ 1I'm Thread-2 @ 1I'm Thread-4 @ 2I'm Thread-5 @ 2I'm Thread-2 @ 2I'm Thread-1 @ 2I'm Thread-3 @ 2說明
從代碼和執行結果我們可以看出,多線程程序的執行順序是不確定的。當執行到sleep語句時,線程將被阻塞(Blocked),到sleep結束后,線程進入就緒(Runnable)狀態,等待調度。
而線程調度將自行選擇一個線程執行。上面的代碼中只能保證每個線程都運行完整個run函數,但是線程的啟動順序、run函數中每次循環的執行順序都不能確定。
3. 總結
每個線程默認有一個名字,盡管上面的例子中沒有指定線程對象的name,但是python會自動為線程指定一個名字。
當線程的run()方法結束時該線程完成。
無法控制線程調度程序,但可以通過別的方式來影響線程調度的方式。
總結
以上是生活随笔為你收集整理的Python---多任务介绍以及Thread的基本使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 说说几个 Python 内存分配时的小秘
- 下一篇: Python---udp绑定信息以及网络