溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python中多線程是什么

發(fā)布時(shí)間:2020-10-24 14:02:39 來(lái)源:億速云 閱讀:263 作者:小新 欄目:編程語(yǔ)言

小編給大家分享一下python中多線程是什么,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

大家可以根據(jù)以下Python多線程的實(shí)例應(yīng)用和結(jié)合現(xiàn)有認(rèn)知更深刻了解python多線程。

在Python 3中已經(jīng)內(nèi)置了_thread和threading兩個(gè)模塊來(lái)實(shí)現(xiàn)多線程。相較于_thread,threading提供的方法更多而且更常用,因此接下來(lái)我們將舉例講解threading模塊的用法,首先來(lái)看下面這段代碼:

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這個(gè)Python內(nèi)置模塊來(lái)實(shí)現(xiàn)多線程。之后定義了一個(gè)say_after(what, delay)函數(shù),該函數(shù)包含what和delay兩個(gè)參數(shù),分別用來(lái)表示打印的內(nèi)容,以及time.sleep()休眠的時(shí)間。

2、隨后我們使用threading的Thread()函數(shù)為say_after(what, delay)函數(shù)創(chuàng)建了一個(gè)線程并將它賦值給變量t,注意Thread()里的target參數(shù)對(duì)應(yīng)的是函數(shù)名稱(即這里的say_after),args對(duì)應(yīng)的是該say_after函數(shù)里的參數(shù),這里等同于“what = ‘hello’”,“delay = 3”。

3、最后我們調(diào)用threading中的start()來(lái)啟動(dòng)我們剛剛創(chuàng)建的線程。

運(yùn)行代碼效果:

python中多線程是什么

在打印出第一個(gè)hello后,程序因?yàn)閠ime.sleep(3)休眠了三秒,三秒之后隨即打印出了第二個(gè)hello。因?yàn)檫@時(shí)我們只運(yùn)行了say_after(what, delay)這一個(gè)函數(shù),并且只運(yùn)行了一次,因此即使我們現(xiàn)在啟用了多線程,我們也感受不了它和單線程有什么區(qū)別。接下來(lái)我們將該代碼修改如下:

#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')} 開(kāi)始執(zhí)行")
 t.start()
 print (f"程序于 {time.strftime('%X')} 執(zhí)行結(jié)束")

這一次我們調(diào)用time.strftime()來(lái)嘗試記錄程序執(zhí)行前和執(zhí)行后的時(shí)間,看看有什么“意想不到”的結(jié)果。

運(yùn)行代碼效果:

python中多線程是什么

這里除了threading.Thread()為say_after()函數(shù)創(chuàng)建的用戶線程外,“print (f"程序于 {time.strftime('%X')} 開(kāi)始執(zhí)行")”和“print (f"程序于 {time.strftime('%X')} 執(zhí)行結(jié)束")”兩個(gè)print()函數(shù)也共同占用了公用的內(nèi)核線程。也就是說(shuō)該腳本現(xiàn)在實(shí)際上是調(diào)用了兩個(gè)線程:一個(gè)用戶線程,一個(gè)內(nèi)核線程,也就構(gòu)成了一個(gè)多線程的環(huán)境。因?yàn)榉謱俨煌木€程,say_after()函數(shù)和函數(shù)之外的兩個(gè)print語(yǔ)句是同時(shí)運(yùn)行的,互不干涉。

如果想要正確捕捉say_after(what, delay)函數(shù)開(kāi)始和結(jié)束時(shí)的時(shí)間,我們需要額外使用threading模塊的join()方法,來(lái)看下面的代碼:

#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')} 開(kāi)始執(zhí)行")
 t.start()
 t.join()
 print (f"程序于 {time.strftime('%X')} 執(zhí)行結(jié)束")

這里我們只修改了代碼的一處地方,即在t.start()下面添加了一個(gè)t.join(),join()方法的作用是強(qiáng)制阻塞調(diào)用它的線程,直到該線程運(yùn)行完畢或者終止為止(類似于單線程同步)。因?yàn)檫@里調(diào)用join()方法的變量t正是我們用threading.Thread()為say_after(what, delay)創(chuàng)建的用戶線程,因此使用內(nèi)核線程的“print (f"程序于 {time.strftime('%X')} 執(zhí)行結(jié)束")”必須等待該用戶線程執(zhí)行完畢過(guò)后才能繼續(xù)執(zhí)行,因此腳本在執(zhí)行時(shí)的效果會(huì)讓你覺(jué)得整體還是以“單線程同步”的方式運(yùn)行的。

運(yùn)行代碼效果:

python中多線程是什么

最后我們?cè)倥e一例,來(lái)看看創(chuàng)建多個(gè)用戶線程并運(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')} 開(kāi)始執(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 + '開(kāi)始執(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個(gè)線程,并且將它們以多線程的形式執(zhí)行,也就是把say_after(what, delay)函數(shù)以多線程的形式執(zhí)行了5次。每個(gè)線程作為元素加入進(jìn)了threads這個(gè)空列表,然后我們?cè)俅问褂胒or語(yǔ)句來(lái)遍歷現(xiàn)在已經(jīng)有了5個(gè)線程的threads列表,對(duì)其中的每個(gè)線程都調(diào)用的join()方法,確保直到它們都執(zhí)行結(jié)束后,我們才執(zhí)行內(nèi)核線程下的“print (f"程序于 {time.strftime('%X')} 執(zhí)行結(jié)束")”。

運(yùn)行代碼效果:

python中多線程是什么

可以看到這里我們成功的使用了多線程將程序執(zhí)行,如果以單線程來(lái)執(zhí)行5次say_after(what,delay)函數(shù)的話,那么需要花費(fèi)3x5=15秒才能跑完整個(gè)腳本,而在多線程的形式下,整個(gè)程序只花費(fèi)了3秒就運(yùn)行完畢。

以上是python中多線程是什么的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI