threading多线程模块
生活随笔
收集整理的這篇文章主要介紹了
threading多线程模块
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
操作系統(tǒng):(承上啟下作用,起到硬件與應(yīng)用程序之間的連接作用(或者接口作用))
進(jìn)程:本質(zhì)上是一段程序運(yùn)行的過程,是一個(gè)抽象的概念。
進(jìn)程的目的就是切換,也就是程序A與程序B矛盾時(shí),可以切換執(zhí)行,提高CPU的效率。
進(jìn)程包括三部分:程序,數(shù)據(jù)集,程序控制塊三個(gè)部分。
程序是一個(gè)實(shí)體,進(jìn)程是一個(gè)抽象。數(shù)據(jù)集相當(dāng)于輸入。程序控制塊用于切換時(shí),記錄上一個(gè)進(jìn)程執(zhí)行到哪等信息。
說道切換,可以是一個(gè)進(jìn)程遇到IO操作的時(shí)候,執(zhí)行切換(因?yàn)镮O時(shí),CPU空閑);也可以根據(jù)時(shí)間序列切換等等。
如果只有一個(gè)CPU,進(jìn)程切換只是實(shí)現(xiàn)并發(fā)(感覺看起來一起執(zhí)行,比如既可以上網(wǎng),也可以聽歌,實(shí)際上不是同時(shí)執(zhí)行),
并行至少需要多核(多個(gè)cpu).這樣假如兩個(gè)CPU同時(shí)對(duì)應(yīng)4個(gè)任務(wù),這樣就既有并行也有并發(fā)。
線程:有了進(jìn)程后,可以實(shí)現(xiàn)一邊玩游戲一邊聽音樂了。假設(shè)一個(gè)文本程序,當(dāng)鍵盤輸入的同時(shí),需要屏幕顯示,并且同時(shí)刻錄到磁盤中。
如果只是用一個(gè)進(jìn)程的話,只能安順序執(zhí)行,也就是說鍵盤輸入的同時(shí),屏幕上是看不到的,要等輸入完。
因此需要多進(jìn)程,但是一個(gè)程序就這樣分了,搞得跟多個(gè)程序似的,并且多進(jìn)程切換過程會(huì)降低效率。
線程其實(shí)可以理解為一個(gè)進(jìn)程中微進(jìn)程,它共享一個(gè)進(jìn)程中的資源集,線程的切換也比進(jìn)程的切換省事。比如扣扣,既可以一邊聊天,
又可以一邊接收郵箱信息。它們共享一個(gè)用戶的信息,狀態(tài)什么的。
進(jìn)程與線程區(qū)別:
1.一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程。(進(jìn)程可以理解成線程的容器)
2.進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線程共享(一個(gè)進(jìn)程)內(nèi)存,從而極大地提高了程序的運(yùn)行效率
3.線程是最小的執(zhí)行單元,進(jìn)程是最小的資源單位(操作系統(tǒng)分資源最小分發(fā)進(jìn)程)。線程不可能脫離進(jìn)程獨(dú)立存在
等等
下面看兩個(gè)簡(jiǎn)單的多線程例子: 1 import threading 2 import time 3 4 def music(): 5 print("begin to listen %s"%time.ctime()) 6 time.sleep(3) 7 print("stop listening %s" % time.ctime()) 8 9 def game(): 10 print("begin to game %s"%time.ctime()) 11 time.sleep(5) 12 print("stop gaming %s" % time.ctime()) 13 14 15 if __name__ == '__main__': 16 17 t1 = threading.Thread(target=music) 18 19 t2 = threading.Thread(target=game) 20 21 t1.start() # 與lesson2放在上面是一樣的 22 t2.start() 23 24 t1.join() # join這個(gè)方法是子線程對(duì)象調(diào)用的函數(shù),函數(shù)的意思是t1這個(gè)子線等待結(jié)束后,主線程才能走 25 # t2.join() 26 27 # 與join對(duì)應(yīng)的.setDaemon是守護(hù)線程,比如T1設(shè)置為守護(hù)線程, 28 # 意思就是t1這個(gè)線程跟主線程一起退,主線程結(jié)束后,它問一下其他非守護(hù)線程,其他的非守護(hù)線程也都結(jié)束,它結(jié)束 29 30 print("ending............") View Code 1 ''' 2 線程,threading可以開線程,里面實(shí)例對(duì)象有幾個(gè)重要的方法,比如:.start,.join,.setDaemon 3 t = threading.Thread() 4 以上是t的方法(實(shí)例化的屬性) 5 另外threading模塊還有一些方法: 6 threading.currentThread() 返回當(dāng)前的線程變量 7 threading.enumerate() 返回一個(gè)包含正在運(yùn)行的線程的list.正在運(yùn)行指線程啟動(dòng)后,結(jié)束前。 8 threading.activeCount() 返回正在運(yùn)行的線程數(shù)量,與len(threading.enumerate())有相同的結(jié)果 9 ''' 10 11 import threading # 線程 12 import time 13 14 15 def Hi(num, i): 16 print("hello %s" % num) 17 time.sleep(int(i)) 18 19 20 if __name__ == '__main__': 21 22 # 主線程下面開了兩個(gè)子線程 23 24 t1 = threading.Thread(target=Hi, args=(10,2)) # 實(shí)例化一個(gè)線程對(duì)象,開一個(gè)子線程1 25 t1.start() 26 27 t2 = threading.Thread(target=Hi, args=(9,7)) # 實(shí)例化一個(gè)線程對(duì)象,開一個(gè)子線程2 28 t2.start() 29 30 print("ending.................") View Code
進(jìn)程:本質(zhì)上是一段程序運(yùn)行的過程,是一個(gè)抽象的概念。
進(jìn)程的目的就是切換,也就是程序A與程序B矛盾時(shí),可以切換執(zhí)行,提高CPU的效率。
進(jìn)程包括三部分:程序,數(shù)據(jù)集,程序控制塊三個(gè)部分。
程序是一個(gè)實(shí)體,進(jìn)程是一個(gè)抽象。數(shù)據(jù)集相當(dāng)于輸入。程序控制塊用于切換時(shí),記錄上一個(gè)進(jìn)程執(zhí)行到哪等信息。
說道切換,可以是一個(gè)進(jìn)程遇到IO操作的時(shí)候,執(zhí)行切換(因?yàn)镮O時(shí),CPU空閑);也可以根據(jù)時(shí)間序列切換等等。
如果只有一個(gè)CPU,進(jìn)程切換只是實(shí)現(xiàn)并發(fā)(感覺看起來一起執(zhí)行,比如既可以上網(wǎng),也可以聽歌,實(shí)際上不是同時(shí)執(zhí)行),
并行至少需要多核(多個(gè)cpu).這樣假如兩個(gè)CPU同時(shí)對(duì)應(yīng)4個(gè)任務(wù),這樣就既有并行也有并發(fā)。
線程:有了進(jìn)程后,可以實(shí)現(xiàn)一邊玩游戲一邊聽音樂了。假設(shè)一個(gè)文本程序,當(dāng)鍵盤輸入的同時(shí),需要屏幕顯示,并且同時(shí)刻錄到磁盤中。
如果只是用一個(gè)進(jìn)程的話,只能安順序執(zhí)行,也就是說鍵盤輸入的同時(shí),屏幕上是看不到的,要等輸入完。
因此需要多進(jìn)程,但是一個(gè)程序就這樣分了,搞得跟多個(gè)程序似的,并且多進(jìn)程切換過程會(huì)降低效率。
線程其實(shí)可以理解為一個(gè)進(jìn)程中微進(jìn)程,它共享一個(gè)進(jìn)程中的資源集,線程的切換也比進(jìn)程的切換省事。比如扣扣,既可以一邊聊天,
又可以一邊接收郵箱信息。它們共享一個(gè)用戶的信息,狀態(tài)什么的。
進(jìn)程與線程區(qū)別:
1.一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程。(進(jìn)程可以理解成線程的容器)
2.進(jìn)程在執(zhí)行過程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線程共享(一個(gè)進(jìn)程)內(nèi)存,從而極大地提高了程序的運(yùn)行效率
3.線程是最小的執(zhí)行單元,進(jìn)程是最小的資源單位(操作系統(tǒng)分資源最小分發(fā)進(jìn)程)。線程不可能脫離進(jìn)程獨(dú)立存在
等等
下面看兩個(gè)簡(jiǎn)單的多線程例子: 1 import threading 2 import time 3 4 def music(): 5 print("begin to listen %s"%time.ctime()) 6 time.sleep(3) 7 print("stop listening %s" % time.ctime()) 8 9 def game(): 10 print("begin to game %s"%time.ctime()) 11 time.sleep(5) 12 print("stop gaming %s" % time.ctime()) 13 14 15 if __name__ == '__main__': 16 17 t1 = threading.Thread(target=music) 18 19 t2 = threading.Thread(target=game) 20 21 t1.start() # 與lesson2放在上面是一樣的 22 t2.start() 23 24 t1.join() # join這個(gè)方法是子線程對(duì)象調(diào)用的函數(shù),函數(shù)的意思是t1這個(gè)子線等待結(jié)束后,主線程才能走 25 # t2.join() 26 27 # 與join對(duì)應(yīng)的.setDaemon是守護(hù)線程,比如T1設(shè)置為守護(hù)線程, 28 # 意思就是t1這個(gè)線程跟主線程一起退,主線程結(jié)束后,它問一下其他非守護(hù)線程,其他的非守護(hù)線程也都結(jié)束,它結(jié)束 29 30 print("ending............") View Code 1 ''' 2 線程,threading可以開線程,里面實(shí)例對(duì)象有幾個(gè)重要的方法,比如:.start,.join,.setDaemon 3 t = threading.Thread() 4 以上是t的方法(實(shí)例化的屬性) 5 另外threading模塊還有一些方法: 6 threading.currentThread() 返回當(dāng)前的線程變量 7 threading.enumerate() 返回一個(gè)包含正在運(yùn)行的線程的list.正在運(yùn)行指線程啟動(dòng)后,結(jié)束前。 8 threading.activeCount() 返回正在運(yùn)行的線程數(shù)量,與len(threading.enumerate())有相同的結(jié)果 9 ''' 10 11 import threading # 線程 12 import time 13 14 15 def Hi(num, i): 16 print("hello %s" % num) 17 time.sleep(int(i)) 18 19 20 if __name__ == '__main__': 21 22 # 主線程下面開了兩個(gè)子線程 23 24 t1 = threading.Thread(target=Hi, args=(10,2)) # 實(shí)例化一個(gè)線程對(duì)象,開一個(gè)子線程1 25 t1.start() 26 27 t2 = threading.Thread(target=Hi, args=(9,7)) # 實(shí)例化一個(gè)線程對(duì)象,開一個(gè)子線程2 28 t2.start() 29 30 print("ending.................") View Code
?
轉(zhuǎn)載于:https://www.cnblogs.com/maxiaonong/p/9500372.html
總結(jié)
以上是生活随笔為你收集整理的threading多线程模块的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 管理你的代码——Git学习(一)
- 下一篇: C语言多线程编程一