最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解python中的線程

 更新時(shí)間:2018年02月10日 08:34:33   作者:renpingsheng  
Python中創(chuàng)建線程有兩種方式:函數(shù)或者用類來(lái)創(chuàng)建線程對(duì)象。這篇文章主要介紹了python中的線程,需要的朋友可以參考下

Python中創(chuàng)建線程有兩種方式:函數(shù)或者用類來(lái)創(chuàng)建線程對(duì)象。

函數(shù)式:調(diào)用 _thread 模塊中的start_new_thread()函數(shù)來(lái)產(chǎn)生新線程。

類:創(chuàng)建threading.Thread的子類來(lái)包裝一個(gè)線程對(duì)象。

1.線程的創(chuàng)建

1.1 通過(guò)thread類直接創(chuàng)建   

import threading
  import time
  def foo(n):
    time.sleep(n)
    print("foo func:",n)
  def bar(n):
    time.sleep(n)
    print("bar func:",n)
  s1=time.time()
  #創(chuàng)建一個(gè)線程實(shí)例t1,foo為這個(gè)線程要運(yùn)行的函數(shù)
  t1=threading.Thread(target=foo,args=(3,))
  t1.start()  #啟動(dòng)線程t1
  #創(chuàng)建一個(gè)線程實(shí)例t2,bar為這個(gè)線程要運(yùn)行的函數(shù)
  t2=threading.Thread(target=bar,args=(5,))
  t2.start()  #啟動(dòng)線程t2
  print("ending")
  s2=time.time()
  print("cost time:",s2-s1)

在這段程序里,一個(gè)函數(shù)會(huì)先休眠幾秒鐘,然后再打印一句話,第二個(gè)函數(shù)也是先休眠幾秒鐘,然后打印一句話。

接著程序會(huì)實(shí)例化兩個(gè)線程,并調(diào)用兩個(gè)函數(shù)來(lái)執(zhí)行,最后會(huì)打印程序問(wèn)總共執(zhí)行了多少時(shí)間

程序運(yùn)行結(jié)果如下:

ending
cost time: 0.002000093460083008
foo func: 3
bar func: 5

程序會(huì)先運(yùn)行父線程,打印"ending",然后打印程序執(zhí)行父線程的時(shí)間,最后才會(huì)運(yùn)行子線程

1.2 通過(guò)thread類來(lái)繼承式創(chuàng)建

 import threading
  import time
  # 定義MyThread類,其繼承自threading.Thread這個(gè)父類
  class MyThread(threading.Thread): 
    def __init__(self):
      threading.Thread.__init__(self)
    def run(self):
      print("ok")
      time.sleep(2)
      print("end t1")
  # 對(duì)類進(jìn)行實(shí)例化
  t1=MyThread()  
  # 啟動(dòng)線程
  t1.start()
  print("ending")

2. Thread類的一些常用方法

2.1 join():在子線程完成之前,主線程將一直被阻塞****

線程的join方法必須在子線程的start方法之后定義
在第一個(gè)例子中加入兩行代碼,如下:   

import threading
  import time
  def foo(n):
    time.sleep(n)
    print("foo func:",n)
  def bar(n):
    time.sleep(n)
    print("bar func:",n)
  s1=time.time()
  t1=threading.Thread(target=foo,args=(3,))
  t1.start()
  t2=threading.Thread(target=bar,args=(5,))
  t2.start()
  t1.join()    # 阻塞t1線程
  t2.join()    # 阻塞t2線程
  print("ending")
  s2=time.time()
  print("cost time:",s2-s1)

再次執(zhí)行程序,運(yùn)行結(jié)果如下:

foo func: 3
bar func: 5
ending
cost time: 5.002285957336426

程序運(yùn)行到子線程t1中的foo方法時(shí)會(huì)睡眠3秒鐘,與此同時(shí),子線程t2也在睡眠

等到子線程t1睡眠完成后,開始打印foo函數(shù)中的print語(yǔ)句,然后子線程t1執(zhí)行完成

2秒鐘之后,子線程t2睡眠完成,開始打印bar函數(shù)中的print語(yǔ)句,然后子線程t2也執(zhí)行完成。

而在這之前,主線程一直處于阻塞狀態(tài)。等到子線程執(zhí)行完成之后主線程才會(huì)執(zhí)行

2.2 setDeamon(True)

setDaemon方法作用是將進(jìn)程聲明為守護(hù)線程,必須在`start()`方法調(diào)用之前,
如果不設(shè)置為守護(hù)線程,程序會(huì)被無(wú)限掛起

在程序執(zhí)行過(guò)程中,執(zhí)行一個(gè)主線程,主線程又創(chuàng)建一個(gè)子線程時(shí),主線程和子線程會(huì)分別運(yùn)行。

當(dāng)主線程運(yùn)行完成時(shí),會(huì)檢驗(yàn)子線程是否執(zhí)行完成,如果子線程執(zhí)行完成,則主線程會(huì)等待子線程完成后再退出。

但是有的時(shí)候只要主線程執(zhí)行完成之后,不管子線程是否執(zhí)行完成,都和主線程一起退出,這個(gè)就需要調(diào)用setDeamon方法了。

拿第一個(gè)例子來(lái)說(shuō)吧,現(xiàn)在我想讓子線程t1和t2隨同主線程關(guān)閉,代碼如下:

 import threading
  import time
  def foo(n):
    print("foo start")
    time.sleep(n)
    print("foo end...")
  def bar(n):
    print("bar start")
    time.sleep(n)
    print("bar end...")
  s1 = time.time()
  t1 = threading.Thread(target=foo, args=(3,))
  t1.setDaemon(True)
  t1.start()
  t2 = threading.Thread(target=bar, args=(5,))
  t2.setDaemon(True)
  t2.start()
  print("ending")
  s2 = time.time()
  print("cost time:", s2 - s1)

程序運(yùn)行結(jié)果如下 :

foo start
bar start
ending
cost time: 0.003000020980834961

可以看到,把t1和t2都聲明為守護(hù)線程后,程序自上而下執(zhí)行,先執(zhí)行子線程t1中的foo方法,打印foo函數(shù)中的第一條打印語(yǔ)句,然后子線程t1進(jìn)入到睡眠狀態(tài)。

然后子線程t2執(zhí)行,打印bar函數(shù)中的第一條print語(yǔ)句,然后子線程t2進(jìn)入睡眠狀態(tài),程序切換到主線程運(yùn)行

主線程打印完"ending"語(yǔ)句,發(fā)現(xiàn)子線程t1和t2已經(jīng)被設(shè)置為守護(hù)線程,所以主線程不需要再等待兩個(gè)子線程執(zhí)行完成,而是立即結(jié)束,打印整個(gè)程序的執(zhí)行時(shí)間。

整個(gè)程序就跟隨主線程一起關(guān)閉了。

2.3 子線程的一些其他方法

isAlive()      #判斷一個(gè)線程是否是活動(dòng)線程
getName()      #返回線程的名字
setName()      #設(shè)置線程的名字
  import threading
  import time
  def foo(n):
    time.sleep(n)
    print("foo func:", n)
  def bar(n):
    time.sleep(n)
    print("bar func:", n)
  s1 = time.time()
  t1 = threading.Thread(target=foo, args=(3,))
  t1.setDaemon(True)
  print("線程還未啟動(dòng)時(shí),判斷t1是否是活動(dòng)的線程:", t1.isAlive()) # 線程還未啟動(dòng),所以是False
  t1.start() # 啟動(dòng)線程
  print("線程已啟動(dòng)時(shí),判斷t1是否是活動(dòng)的線程:", t1.isAlive()) # 線程已啟動(dòng),所以是True
  print("修改前的線程名為:",t1.getName()) # 獲取線程名
  t1.setName("t1")    #設(shè)置線程名
  print("修改后的線程名為:",t1.getName()) # 獲取線程名
  t1.join()
  print("線程執(zhí)行完成時(shí),判斷t1是不否是活動(dòng)的線程:", t1.isAlive()) # 線程已執(zhí)行完成,所以是False
  # print(threading.activeCount())
  print("ending")
  s2 = time.time()
  print("cost time:", s2 - s1)

程序執(zhí)行結(jié)果:

線程還未啟動(dòng)時(shí),判斷t1是否是活動(dòng)的線程: False
線程已啟動(dòng)時(shí),判斷t1是否是活動(dòng)的線程: True
修改前的線程名為: Thread-1
修改后的線程名為: t1
foo func: 3
線程執(zhí)行完成時(shí),判斷t1是不否是活動(dòng)的線程: False
ending
cost time: 3.001171588897705

3.threading模塊提供的一些方法

threading.currentThread()  #返回當(dāng)前的線程變量
threading.enumerate()    #返回一個(gè)包含正在運(yùn)行的線程的列表,不包括啟動(dòng)前和終止后的線程
threading.activeCount()   #返回正在運(yùn)行的線程數(shù)量,等同于len(threading.enumerate())
  import threading
  import time
  def foo(n):
    time.sleep(n)
    print("foo func:", n)
  def bar(n):
    time.sleep(n)
    print("bar func:", n)
  s1 = time.time()
  t1 = threading.Thread(target=foo, args=(3,))
  t1.setDaemon(True)
  t1.start()
  t2 = threading.Thread(target=bar, args=(5,))
  t2.setDaemon(True)
  t2.start()
  print("程序中正在運(yùn)行的線程數(shù)量:",threading.activeCount())
  print("程序中當(dāng)前的線程變量:",threading.currentThread())
  print("當(dāng)前正在運(yùn)行的線程的列表:",threading.enumerate())
  print("ending")
  s2 = time.time()
  print("cost time:", s2 - s1)

程序執(zhí)行結(jié)果:

程序中正在運(yùn)行的線程數(shù)量: 3
程序中當(dāng)前的線程變量: <_MainThread(MainThread, started 7064)>
當(dāng)前正在運(yùn)行的線程的列表: [<_MainThread(MainThread, started 7064)>, <Thread(Thread-1, started daemon 6384)>, <Thread(Thread-2, started daemon 2640)>]
ending
cost time: 0.002000093460083008

總結(jié)

以上所述是小編給大家介紹的詳解python中的線程,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Python編程快速上手——強(qiáng)口令檢測(cè)算法案例分析

    Python編程快速上手——強(qiáng)口令檢測(cè)算法案例分析

    這篇文章主要介紹了Python強(qiáng)口令檢測(cè)算法,結(jié)合實(shí)例形式分析了Python針對(duì)密碼口令強(qiáng)度檢測(cè)的相關(guān)算法實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2020-02-02
  • Python Django給admin添加Action的方法實(shí)例詳解

    Python Django給admin添加Action的方法實(shí)例詳解

    這篇文章主要介紹了Django給admin添加Action的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • 使用Python繪制空氣質(zhì)量日歷圖

    使用Python繪制空氣質(zhì)量日歷圖

    這篇文章主要介紹了使用Python繪制空氣質(zhì)量日歷圖,文章基于Python繪制的相關(guān)知識(shí)展開對(duì)空氣質(zhì)量日歷圖的繪制,感興趣的小伙伴可以參考一下
    2022-05-05
  • Python 實(shí)現(xiàn)子類獲取父類的類成員方法

    Python 實(shí)現(xiàn)子類獲取父類的類成員方法

    今天小編就為大家分享一篇Python 實(shí)現(xiàn)子類獲取父類的類成員方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • Python使用draw類繪制圖形示例講解

    Python使用draw類繪制圖形示例講解

    這篇文章主要介紹了Python使用draw類繪制圖形的哪些函數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 解決Pandas to_json()中文亂碼,轉(zhuǎn)化為json數(shù)組的問(wèn)題

    解決Pandas to_json()中文亂碼,轉(zhuǎn)化為json數(shù)組的問(wèn)題

    今天小編就為大家分享一篇解決Pandas to_json() 中文亂碼,轉(zhuǎn)化為json數(shù)組的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Python爬蟲爬取ts碎片視頻+驗(yàn)證碼登錄功能

    Python爬蟲爬取ts碎片視頻+驗(yàn)證碼登錄功能

    這篇文章主要介紹了Python爬蟲爬取ts碎片視頻+驗(yàn)證碼登錄功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • Python如何實(shí)現(xiàn)一個(gè)CLI命令行功能

    Python如何實(shí)現(xiàn)一個(gè)CLI命令行功能

    Click是一個(gè)強(qiáng)大的Python庫(kù),專門用于快速創(chuàng)建命令行界面,本文將詳細(xì)介紹Click庫(kù)的功能以及CLI的應(yīng)用場(chǎng)景,并通過(guò)具體代碼示例展示如何實(shí)現(xiàn)CLI,有需要的可以了解下
    2025-02-02
  • 在Python中進(jìn)行CSV文件的讀取與寫入操作

    在Python中進(jìn)行CSV文件的讀取與寫入操作

    本文詳細(xì)介紹了如何在Python中使用csv模塊進(jìn)行CSV文件的讀取和寫入,包括基本用法和高級(jí)功能,如DictWriter和DictReader,以及注意事項(xiàng),需要的朋友可以參考下
    2025-03-03
  • python實(shí)現(xiàn)的解析crontab配置文件代碼

    python實(shí)現(xiàn)的解析crontab配置文件代碼

    這篇文章主要介紹了python實(shí)現(xiàn)的解析crontab配置文件代碼,也可以說(shuō)是python版的crontab,代碼中包含大量注釋,需要的朋友可以參考下
    2014-06-06

最新評(píng)論

焦作市| 弥渡县| 巴林左旗| 河北区| 盐源县| 承德县| 东兰县| 武宣县| 天全县| 新野县| 东辽县| 章丘市| 平果县| 民丰县| 渝中区| 株洲市| 旬邑县| 阳春市| 凌云县| 郯城县| 平乐县| 宜城市| 达州市| 冕宁县| 古蔺县| 隆安县| 鹤山市| 江源县| 舟山市| 胶南市| 涞源县| 莱西市| 奉新县| 清河县| 米泉市| 恩平市| 且末县| 桂平市| 麻城市| 商南县| 奇台县|