日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python---多任务介绍以及Thread的基本使用

發布時間:2025/3/20 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python---多任务介绍以及Thread的基本使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

多任務介紹
現實生活中
有很多的場景中的事情是同時進行的,比如開車的時候 手和腳共同來駕駛汽車,再比如唱歌跳舞也是同時進行的;

想,如果把唱歌和跳舞這2件事情分開依次完成的話,估計就沒有那么好的效果了(想一下場景:先唱歌,然后在跳舞,O(∩_∩)O哈哈~)

程序中
如下程序,來模擬“唱歌跳舞”這件事情

#coding=utf-8from time import sleepdef 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__':sing() #唱歌dance() #跳舞

運行結果如下:

注意

  • 很顯然剛剛的程序并沒有完成唱歌和跳舞同時進行的要求

  • 如果想要實現“唱歌跳舞”同時進行,那么就需要一個新的方法,叫做:多任務

多任務的概念

什么叫“多任務”呢?簡單地說,就是操作系統可以同時運行多個任務。打個比方,你一邊在用瀏覽器上網,一邊在聽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模塊
單線程執行

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴, 互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' #coding=utf-8 import timedef saySorry():print("親愛的,我錯了,我能吃飯了嗎?")time.sleep(1)if __name__ == "__main__":for i in range(5):saySorry()

運行結果:

多線程執行

#coding=utf-8 import threading import timedef saySorry():print("親愛的,我錯了,我能吃飯了嗎?")time.sleep(1)if __name__ == "__main__":for i in range(5):t = threading.Thread(target=saySorry)t.start() #啟動線程,即讓線程開始執行

運行結果:

說明

  • 可以明顯看出使用了多線程并發的操作,花費時間要短很多

  • 當調用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. 查看線程數量

''' 遇到問題沒人解答?小編創建了一個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()while True:length = len(threading.enumerate())print('當前運行的線程數為:%d'%length)if length<=1:breaksleep(0.5)


線程(注意點)

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的基本使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。