欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

改變 Python 中線程執(zhí)行順序的方法

 更新時(shí)間:2020年09月24日 08:52:47   作者:小名叫小明  
這篇文章主要介紹了改變 Python 中線程的執(zhí)行順序的方法,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下

一、主線程會(huì)等待所有的子線程結(jié)束后才結(jié)束

首先我看下最普通情況下,主線程和子線程的情況。

import threading
from time import sleep, ctime

def 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('---開(kāi)始---:%s' % ctime())

 t1 = threading.Thread(target=sing)
 t2 = threading.Thread(target=dance)

 t1.start()
 t2.start()

 print('---結(jié)束---:%s' % ctime())

運(yùn)行結(jié)果:

最后一行打印的代碼就算在一開(kāi)始運(yùn)行了,程序也不會(huì)結(jié)束。

只有等待所有的子線程(sing 和 dance)都執(zhí)行完畢,主線程才會(huì)結(jié)束,即程序結(jié)束。

二、默認(rèn)狀態(tài)下,多線程的執(zhí)行順序是不確定的

我們先來(lái)看一段代碼:

import threading
import time

class 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()

運(yùn)行結(jié)果:

I'm Thread-1 @ 0
I'm Thread-2 @ 0
I'm Thread-3 @ 0
I'm Thread-4 @ 0
I'm Thread-5 @ 0
I'm Thread-1 @ 1
I'm Thread-3 @ 1
I'm Thread-2 @ 1
I'm Thread-4 @ 1
I'm Thread-5 @ 1
I'm Thread-1 @ 2
I'm Thread-3 @ 2
I'm Thread-2 @ 2
I'm Thread-4 @ 2
I'm Thread-5 @ 2

每次的運(yùn)行結(jié)果可能都不一樣,但大體差不多。

說(shuō)明:

從代碼和執(zhí)行結(jié)果我們可以看出,多線程程序的執(zhí)行順序是不確定的。

當(dāng)執(zhí)行到 sleep 語(yǔ)句時(shí),線程將被阻塞,到 sleep 結(jié)束后,線程進(jìn)入就緒狀態(tài),等待調(diào)度,而線程調(diào)度將自行選擇一個(gè)線程執(zhí)行。

上面的代碼中只能保證每個(gè)線程都運(yùn)行完整個(gè) run 函數(shù),但是線程的啟動(dòng)順序、run 函數(shù)中每次循環(huán)的執(zhí)行順序都不能確定。

總結(jié)

每個(gè)線程默認(rèn)有一個(gè)名字,盡管上面的例子中沒(méi)有指定線程對(duì)象的 name,但是 python 會(huì)自動(dòng)為線程指定一個(gè)名字。

當(dāng)線程的 run() 方法結(jié)束時(shí)該線程完成。

無(wú)法控制線程調(diào)度程序,但可以通過(guò)別的方式來(lái)影響線程調(diào)度的方式。

三、Python daemon 守護(hù)線程詳解

當(dāng)程序中擁有多個(gè)線程時(shí),主線程執(zhí)行結(jié)束并不會(huì)影響子線程繼續(xù)執(zhí)行。

換句話說(shuō),只有程序中所有線程全部執(zhí)行完畢后,程序才算真正結(jié)束。

Python 還支持創(chuàng)建另一種線程,稱為守護(hù)線程(或后臺(tái)線程)。

此類線程的特點(diǎn)是,當(dāng)程序中主線程及所有非守護(hù)線程執(zhí)行結(jié)束時(shí),未執(zhí)行完畢的守護(hù)線程也會(huì)隨之消亡,程序?qū)⒔Y(jié)束運(yùn)行。

守護(hù)線程本質(zhì)也是線程,因此其創(chuàng)建方式和普通線程一樣,唯一不同之處在于,將普通線程設(shè)為守護(hù)線程,需通過(guò)線程對(duì)象調(diào)用其 damon 屬性,將該屬性的值改為 True。

注意:線程對(duì)象調(diào)用 daemon 屬性必須在調(diào)用 start() 方法之前,否則 Python 解釋器將報(bào) RuntimeError 錯(cuò)誤。

import threading

def action(len):
 for i in range(len):
  print(threading.current_thread().getName() + "," + str(i))

def main():
 t1 = threading.Thread(target=action, args=(10,))
 # 設(shè)置子線程為守護(hù)進(jìn)程
 t1.daemon = True
 t1.start()

 for i in range(3):
  print(threading.current_thread().getName()+','+str(i))

if __name__ == "__main__":
 main()

運(yùn)行結(jié)果:

Thread-1,0
MainThread,0
MainThread,1
MainThread,2

程序中,子線程里的程序就循環(huán)了一次,接著主線程執(zhí)行完后,子線程就不打印信息了。

由于該程序中除了守護(hù)線程就只有主線程,因此只要主線程執(zhí)行結(jié)束,則守護(hù)線程也隨之消亡。

四、控制線程執(zhí)行順序

通過(guò)前面的學(xué)習(xí)我們知道,主線程和子線程會(huì)輪流獲得 CPU 的資源。

但有時(shí)候,我們想讓某個(gè)子線程先執(zhí)行,然后再讓主線程執(zhí)行代碼,該如何實(shí)現(xiàn)呢?

很簡(jiǎn)單,通過(guò)調(diào)用線程對(duì)象的 join() 方法即可。

join() 方法的功能是在程序指定位置,優(yōu)先讓該方法的調(diào)用者使用 CPU 資源。

該方法的語(yǔ)法格式如下:

thread.join( [timeout] )

timeout 參數(shù)作為可選參數(shù),其功能是指定 thread 線程最多可以霸占 CPU 資源的時(shí)間(以秒為單位)。

如果省略,則默認(rèn)直到 thread 執(zhí)行結(jié)束(進(jìn)入死亡狀態(tài))才釋放 CPU 資源。

我們?nèi)耘f拿上面的例子來(lái)舉例:

import threading

def action(len):
 for i in range(len):
  print(threading.current_thread().getName() + "," + str(i))

def main():
 t1 = threading.Thread(target=action, args=(10,))
 # 設(shè)置子線程為守護(hù)進(jìn)程
 t1.daemon = True
 t1.start()
 t1.join()
 for i in range(3):
  print(threading.current_thread().getName()+','+str(i))

if __name__ == "__main__":
 main()

我們?cè)谧泳€程調(diào)用的后面,添加了 t1.join()。

運(yùn)行結(jié)果:

Thread-1,0
Thread-1,1
Thread-1,2
Thread-1,3
Thread-1,4
Thread-1,5
Thread-1,6
Thread-1,7
Thread-1,8
Thread-1,9
MainThread,0
MainThread,1
MainThread,2

上面的例子中,t1 線程調(diào)用了 join() 方法,并且沒(méi)有指定具體的 timeout 參數(shù)值。

這意味著如果程序想繼續(xù)往下執(zhí)行,必須先執(zhí)行完 t1 子線程。

以上就是改變 Python 中線程的執(zhí)行順序的方法的詳細(xì)內(nèi)容,更多關(guān)于改變 Python 中線程的執(zhí)行順序的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 解決virtualenv -p python3 venv報(bào)錯(cuò)的問(wèn)題

    解決virtualenv -p python3 venv報(bào)錯(cuò)的問(wèn)題

    這篇文章主要介紹了解決virtualenv -p python3 venv報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • Python3.7 版本 lxml 模塊無(wú)法導(dǎo)入etree 問(wèn)題及解決方法

    Python3.7 版本 lxml 模塊無(wú)法導(dǎo)入etree 問(wèn)題及解決方法

    這篇文章主要介紹了Python3.7 版本 lxml 模塊無(wú)法導(dǎo)入etree 問(wèn)題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • 六個(gè)Python3中使用最廣泛的內(nèi)置函數(shù)總結(jié)

    六個(gè)Python3中使用最廣泛的內(nèi)置函數(shù)總結(jié)

    這篇文章主要為大家詳細(xì)介紹了六個(gè)Python3中使用最廣泛的內(nèi)置函數(shù):Lamdba?函數(shù)、Map?函數(shù)、Filter?函數(shù)、Reduce?函數(shù)、Enumerate?函數(shù)和Zip?函數(shù),需要的可以參考一下
    2022-08-08
  • 使用python提升圖片清晰度的常見(jiàn)方法

    使用python提升圖片清晰度的常見(jiàn)方法

    在Python中,提升圖片清晰度可以通過(guò)多種方法實(shí)現(xiàn),其中一些常見(jiàn)的方法包括使用圖像處理庫(kù)如OpenCV和Pillow,下面小編就來(lái)和大家介紹一下具體實(shí)現(xiàn)方法吧
    2025-04-04
  • Python新手教程之while循環(huán)20例

    Python新手教程之while循環(huán)20例

    循環(huán)的作用就是讓指定的代碼重復(fù)的執(zhí)行,while循環(huán)最常用的應(yīng)用場(chǎng)景就是讓執(zhí)行的代碼按照指定的次數(shù)重復(fù)執(zhí)行,這篇文章主要給大家介紹了關(guān)于Python新手教程之while循環(huán)20例的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • Python中的breakpoint方法使用小結(jié)

    Python中的breakpoint方法使用小結(jié)

    breakpoint 是 Python 3.7 及以后版本中一個(gè)非常有用的內(nèi)置函數(shù),本文主要介紹了Python中的breakpoint方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-04-04
  • Python如何向IP地址發(fā)送字符串

    Python如何向IP地址發(fā)送字符串

    在Python中,向IP地址發(fā)送字符串通常意味著你需要通過(guò)某種協(xié)議來(lái)實(shí)現(xiàn)通信,最常見(jiàn)的協(xié)議包括TCP和UDP,這篇文章主要介紹了Python向IP地址發(fā)送字符串的示例代碼,需要的朋友可以參考下
    2024-08-08
  • TensorFlow實(shí)現(xiàn)自定義Op方式

    TensorFlow實(shí)現(xiàn)自定義Op方式

    今天小編就為大家分享一篇TensorFlow實(shí)現(xiàn)自定義Op方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • Python中函數(shù)的參數(shù)類型詳解

    Python中函數(shù)的參數(shù)類型詳解

    這篇文章主要介紹了Python中函數(shù)的參數(shù)類型詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • python3 selenium 切換窗口的幾種方法小結(jié)

    python3 selenium 切換窗口的幾種方法小結(jié)

    今天小編就為大家分享一篇python3 selenium 切換窗口的幾種方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05

最新評(píng)論