小編給大家分享一下python中多線程是什么,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
10多年的雁塔網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。成都全網(wǎng)營銷的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整雁塔建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)從事“雁塔網(wǎng)站設(shè)計”,“雁塔網(wǎng)站推廣”以來,每個客戶項目都認(rèn)真落實執(zhí)行。
大家可以根據(jù)以下Python多線程的實例應(yīng)用和結(jié)合現(xiàn)有認(rèn)知更深刻了解python多線程。
在Python 3中已經(jīng)內(nèi)置了_thread和threading兩個模塊來實現(xiàn)多線程。相較于_thread,threading提供的方法更多而且更常用,因此接下來我們將舉例講解threading模塊的用法,首先來看下面這段代碼:
import threading import time def say_after(what, delay): print (what) time.sleep(delay) print (what) t = threading.Thread(target = say_after, args = ('hello',3)) t.start()
1、這里我們導(dǎo)入了threading這個Python內(nèi)置模塊來實現(xiàn)多線程。之后定義了一個say_after(what, delay)函數(shù),該函數(shù)包含what和delay兩個參數(shù),分別用來表示打印的內(nèi)容,以及time.sleep()休眠的時間。
2、隨后我們使用threading的Thread()函數(shù)為say_after(what, delay)函數(shù)創(chuàng)建了一個線程并將它賦值給變量t,注意Thread()里的target參數(shù)對應(yīng)的是函數(shù)名稱(即這里的say_after),args對應(yīng)的是該say_after函數(shù)里的參數(shù),這里等同于“what = ‘hello’”,“delay = 3”。
3、最后我們調(diào)用threading中的start()來啟動我們剛剛創(chuàng)建的線程。
運(yùn)行代碼效果:
在打印出第一個hello后,程序因為time.sleep(3)休眠了三秒,三秒之后隨即打印出了第二個hello。因為這時我們只運(yùn)行了say_after(what, delay)這一個函數(shù),并且只運(yùn)行了一次,因此即使我們現(xiàn)在啟用了多線程,我們也感受不了它和單線程有什么區(qū)別。接下來我們將該代碼修改如下:
#coding=utf-8 import threading import time def say_after(what, delay): print (what) time.sleep(delay) print (what) t = threading.Thread(target = say_after, args = ('hello',3)) print (f"程序于 {time.strftime('%X')} 開始執(zhí)行") t.start() print (f"程序于 {time.strftime('%X')} 執(zhí)行結(jié)束")
這一次我們調(diào)用time.strftime()來嘗試記錄程序執(zhí)行前和執(zhí)行后的時間,看看有什么“意想不到”的結(jié)果。
運(yùn)行代碼效果:
這里除了threading.Thread()為say_after()函數(shù)創(chuàng)建的用戶線程外,“print (f"程序于 {time.strftime('%X')} 開始執(zhí)行")”和“print (f"程序于 {time.strftime('%X')} 執(zhí)行結(jié)束")”兩個print()函數(shù)也共同占用了公用的內(nèi)核線程。也就是說該腳本現(xiàn)在實際上是調(diào)用了兩個線程:一個用戶線程,一個內(nèi)核線程,也就構(gòu)成了一個多線程的環(huán)境。因為分屬不同的線程,say_after()函數(shù)和函數(shù)之外的兩個print語句是同時運(yùn)行的,互不干涉。
如果想要正確捕捉say_after(what, delay)函數(shù)開始和結(jié)束時的時間,我們需要額外使用threading模塊的join()方法,來看下面的代碼:
#coding=utf-8 import threading import time def say_after(what, delay): print (what) time.sleep(delay) print (what) t = threading.Thread(target = say_after, args = ('hello',3)) print (f"程序于 {time.strftime('%X')} 開始執(zhí)行") t.start() t.join() print (f"程序于 {time.strftime('%X')} 執(zhí)行結(jié)束")
這里我們只修改了代碼的一處地方,即在t.start()下面添加了一個t.join(),join()方法的作用是強(qiáng)制阻塞調(diào)用它的線程,直到該線程運(yùn)行完畢或者終止為止(類似于單線程同步)。因為這里調(diào)用join()方法的變量t正是我們用threading.Thread()為say_after(what, delay)創(chuàng)建的用戶線程,因此使用內(nèi)核線程的“print (f"程序于 {time.strftime('%X')} 執(zhí)行結(jié)束")”必須等待該用戶線程執(zhí)行完畢過后才能繼續(xù)執(zhí)行,因此腳本在執(zhí)行時的效果會讓你覺得整體還是以“單線程同步”的方式運(yùn)行的。
運(yùn)行代碼效果:
最后我們再舉一例,來看看創(chuàng)建多個用戶線程并運(yùn)行,代碼如下:
#coding=utf-8 import threading import time def say_after(what, delay): print (what) time.sleep(delay) print (what) print (f"程序于 {time.strftime('%X')} 開始執(zhí)行\(zhòng)n") threads = [] for i in range(1,6): t = threading.Thread(target=say_after, name="線程" + str(i), args=('hello',3)) print(t.name + '開始執(zhí)行。') t.start() threads.append(t) for i in threads: i.join() print (f"\n程序于 {time.strftime('%X')} 執(zhí)行結(jié)束")
這里我們使用for循環(huán)配合range(1,6)創(chuàng)建了5個線程,并且將它們以多線程的形式執(zhí)行,也就是把say_after(what, delay)函數(shù)以多線程的形式執(zhí)行了5次。每個線程作為元素加入進(jìn)了threads這個空列表,然后我們再次使用for語句來遍歷現(xiàn)在已經(jīng)有了5個線程的threads列表,對其中的每個線程都調(diào)用的join()方法,確保直到它們都執(zhí)行結(jié)束后,我們才執(zhí)行內(nèi)核線程下的“print (f"程序于 {time.strftime('%X')} 執(zhí)行結(jié)束")”。
運(yùn)行代碼效果:
可以看到這里我們成功的使用了多線程將程序執(zhí)行,如果以單線程來執(zhí)行5次say_after(what,delay)函數(shù)的話,那么需要花費3x5=15秒才能跑完整個腳本,而在多線程的形式下,整個程序只花費了3秒就運(yùn)行完畢。
以上是python中多線程是什么的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!