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

淺談Python中threading join和setDaemon用法及區(qū)別說(shuō)明

 更新時(shí)間:2020年05月02日 09:27:00   作者:編程青年的崛起  
這篇文章主要介紹了淺談Python中threading join和setDaemon用法及區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

Python多線程編程時(shí),經(jīng)常會(huì)用到j(luò)oin()和setDaemon()方法,今天特地研究了一下兩者的區(qū)別。

1、join ()方法:主線程A中,創(chuàng)建了子線程B,并且在主線程A中調(diào)用了B.join(),那么,主線程A會(huì)在調(diào)用的地方等待,直到子線程B完成操作后,才可以接著往下執(zhí)行,那么在調(diào)用這個(gè)線程時(shí)可以使用被調(diào)用線程的join方法。

原型:join([timeout])

里面的參數(shù)時(shí)可選的,代表線程運(yùn)行的最大時(shí)間,即如果超過(guò)這個(gè)時(shí)間,不管這個(gè)此線程有沒(méi)有執(zhí)行完畢都會(huì)被回收,然后主線程或函數(shù)都會(huì)接著執(zhí)行的。

例子:

import threading 
import time 
class MyThread(threading.Thread): 
  def __init__(self,id): 
    threading.Thread.__init__(self) 
    self.id = id 
  def run(self): 
    x = 0 
    time.sleep(10) 
    print self.id 
 
if __name__ == "__main__": 
  t1=MyThread(999) 
  t1.start() 
  for i in range(5): 
    print I

執(zhí)行后的結(jié)果是:

0
1
2
3
4
999

機(jī)器上運(yùn)行時(shí),4和999之間,有明顯的停頓。

解釋:

線程t1 start后,主線程并沒(méi)有等線程t1運(yùn)行結(jié)束后再執(zhí)行,而是先把5次循環(huán)打印執(zhí)行完畢(打印到4),然后sleep(10)后,線程t1把傳進(jìn)去的999才打印出來(lái)。

現(xiàn)在,我們把join()方法加進(jìn)去(其他代碼不變),看看有什么不一樣,例子:

import threading 
import time 
class MyThread(threading.Thread): 
  def __init__(self,id): 
    threading.Thread.__init__(self) 
    self.id = id 
  def run(self): 
    x = 0 
    time.sleep(10) 
    print self.id 
 
if __name__ == "__main__": 
  t1=MyThread(999) 
  t1.start() 
  t1.join() 
  for i in range(5): 
    print I 

執(zhí)行后的結(jié)果是:

999
0
1
2
3
4

機(jī)器上運(yùn)行時(shí),999之前,有明顯的停頓。

解釋:

線程t1 start后,主線程停在了join()方法處,等sleep(10)后,線程t1操作結(jié)束被join,接著,主線程繼續(xù)循環(huán)打印。

2、setDaemon()方法。主線程A中,創(chuàng)建了子線程B,并且在主線程A中調(diào)用了B.setDaemon(),這個(gè)的意思是,把主線程A設(shè)置為守護(hù)線程,這時(shí)候,要是主線程A執(zhí)行結(jié)束了,就不管子線程B是否完成,一并和主線程A退出.這就是setDaemon方法的含義,這基本和join是相反的。此外,還有個(gè)要特別注意的:必須在start() 方法調(diào)用之前設(shè)置,如果不設(shè)置為守護(hù)線程,程序會(huì)被無(wú)限掛起。

例子:就是設(shè)置子線程隨主線程的結(jié)束而結(jié)束:

import threading 
import time 
class MyThread(threading.Thread): 
  def __init__(self,id): 
    threading.Thread.__init__(self) 
  def run(self): 
    time.sleep(5) 
    print "This is " + self.getName() 
 
if __name__ == "__main__": 
  t1=MyThread(999) 
  t1.setDaemon(True) 
  t1.start() 
  print "I am the father thread." 

執(zhí)行后的結(jié)果是:

I am the father thread.

可以看出,子線程t1中的內(nèi)容并未打出。

解釋:t1.setDaemon(True)的操作,將父線程設(shè)置為了守護(hù)線程。根據(jù)setDaemon()方法的含義,父線程打印內(nèi)容后便結(jié)束了,不管子線程是否執(zhí)行完畢了。

程序運(yùn)行中,執(zhí)行一個(gè)主線程,如果主線程又創(chuàng)建一個(gè)子線程,主線程和子線程就分兵兩路,分別運(yùn)行,那么當(dāng)主線程完成想退出時(shí),會(huì)檢驗(yàn)子線程是否完成。

如果子線程未完成,則主線程會(huì)等待子線程完成后再退出。

但是有時(shí)候我們需要的是,只要主線程完成了,不管子線程是否完成,都要和主線程一起退出,這時(shí)就可以用setDaemon方法了。

所以,join和setDaemon的區(qū)別如上述的例子,它們基本是相反的。

以上這篇淺談Python中threading join和setDaemon用法及區(qū)別說(shuō)明就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python boto和boto3操作bucket的示例

    python boto和boto3操作bucket的示例

    這篇文章主要介紹了python boto和boto3操作bucket的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-10-10
  • Python代碼的打包與發(fā)布詳解

    Python代碼的打包與發(fā)布詳解

    這篇文章主要介紹了Python代碼的打包與發(fā)布的方法,需要的朋友可以參考下
    2014-07-07
  • 使用Python實(shí)現(xiàn)分組數(shù)據(jù)并保存到單獨(dú)的文件中

    使用Python實(shí)現(xiàn)分組數(shù)據(jù)并保存到單獨(dú)的文件中

    當(dāng)處理大型數(shù)據(jù)集時(shí),通常需要將數(shù)據(jù)分組,并將每個(gè)分組的數(shù)據(jù)保存到單獨(dú)的文件中,本文將使用 Python 中的 pandas 庫(kù)來(lái)實(shí)現(xiàn)這一目標(biāo),需要的可以參考下
    2024-04-04
  • 磁盤(pán)垃圾文件清理器python代碼實(shí)現(xiàn)

    磁盤(pán)垃圾文件清理器python代碼實(shí)現(xiàn)

    幾行Python代碼打造自己的磁盤(pán)垃圾文件清理器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Python基于pyopencv人臉識(shí)別并繪制GUI界面

    Python基于pyopencv人臉識(shí)別并繪制GUI界面

    本文詳細(xì)講解了Python基于pyopencv人臉識(shí)別并繪制GUI界面,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • Django 拆分model和view的實(shí)現(xiàn)方法

    Django 拆分model和view的實(shí)現(xiàn)方法

    今天小編就為大家分享一篇Django 拆分model和view的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • Python3.5多進(jìn)程原理與用法實(shí)例分析

    Python3.5多進(jìn)程原理與用法實(shí)例分析

    這篇文章主要介紹了Python3.5多進(jìn)程原理與用法,結(jié)合實(shí)例形式分析了多進(jìn)程的原理、單進(jìn)程、多進(jìn)程、進(jìn)程類及進(jìn)程隊(duì)列等相關(guān)定義與使用技巧,需要的朋友可以參考下
    2019-04-04
  • 淺談對(duì)python中if、elif、else的誤解

    淺談對(duì)python中if、elif、else的誤解

    這篇文章主要介紹了淺談對(duì)python中if、elif、else的誤解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 利用Python的Django框架生成PDF文件的教程

    利用Python的Django框架生成PDF文件的教程

    這篇文章主要介紹了利用Python的Django框架生成PDF文件的教程,用ReportLab API動(dòng)態(tài)生成PDF文件,需要的朋友可以參考下
    2015-07-07
  • Python3列表內(nèi)置方法大全及示例代碼小結(jié)

    Python3列表內(nèi)置方法大全及示例代碼小結(jié)

    這篇文章主要介紹了Python3列表內(nèi)置方法大全及示例代碼小結(jié),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-05-05

最新評(píng)論