python threading 學習筆記

來源:互聯網
上載者:User

1.join()方法的使用

join方法,如果一個線程或者一個函數在執行過程中要調用另外一個線程,並且待到其完成以後才能接著執行,那麼在調用這個線程時可以使用被調用線程的join方法

 

例子:

import threading, time

class MyThread(threading.Thread):
    def __init__(self, id):
        threading.Thread.__init__(self)
        self.id = id

    def run(self):
        time.sleep(5)
        print self.id

t = MyThread(1)
def func():
    t.start()
    #t.join()
    print t.isAlive()

print func()
輸出結果

True(線程運行)

none

然後等待5秒以後輸出1

 

如果去掉#t.join井號的話

輸出1

False(線程退出)

none

 

 

2. 給線程設定名字

import threading

class MyThread(threading.Thread):
    def __init__(self, threadname):
        threading.Thread.__init__(self, name=threadname)

    def run(self):
        print self.getName()

t1 = MyThread('t1')
print t1.getName()
print id(t1)

t2 = MyThread('t2')
t2.start() #注意這裡
t2.getName()
t2.setName('TT')
t2.getName()
print id(t2)

 

 

3.守護進程

setDaemon()

這個方法基本和join是相反的。當我們在程式運行中,執行一個主線程,如果主線程又建立一個子線程,主線程和子線程就分兵兩路,分別運行,那麼當主線程完成想退出時,會檢驗子線程是否完成。如果子線程未完成,則主線程會等待子線程完成後再退出。但是有時候我們需要的是,只要主線程完成了,不管子線程是否完成,都要和主線程一起退出,這時就可以用setDaemon方法啦

 

程式如下:

下面的例子就是設定子線程隨主線程的結束而結束:

import threading

import time

 

class myThread(threading.Thread):

    def __init__(self,threadname):

        threading.Thread.__init__(self,name=threadname)

    def run(self):

        time.sleep(5)

 

        print self.getName()

 

def fun1():

    t1.start()

    print 'fun1 done'

 

def fun2():

    t2.start()

    print 'fun2 done'

 

t1=myThread('t1')

t2=myThread('t2')

t2.setDaemon(True)

fun1()

fun2()

 

 

上面這個例子,按照我們設想的輸出時:
fun1 done

fun2 done

 t1

但是實際上我們在互動模式,主線程只有在python退出時終止,所以結果t2也是被列印出來啦。

 

4.建立線程方法

如果你要建立一個線程對象,很簡單,只要你的類繼承threading.Thread,然後在__init__裡首先調用threading.Thread的__init__方法即可:
  這才僅僅是個空線程,我可不是要他拉空車的,他可得給我幹點實在活。很簡單,重寫類的run()方法即可,把你要線上程執行時做的事情都放到裡面
以上代碼我們讓這個線程在執行之後每隔1秒輸出一次資訊到螢幕,10次後結束getName()是threading.Thread類的一個方法,用來獲得這個線程對象的name。還有一個方法setName()當然就是來設定這個線程對象的name的了。

如果要建立一個線程,首先就要先建立一個線程對象
mythread1 = mythread('mythread 1')
         一個線程對象被建立後,他就處於“born”(誕生狀態),如何讓這個線程對象開始運行呢?只要調用線程對象的start()方法即可:
mythread1.start()
現線上程就處於“ready”狀態或者也稱為“runnable”狀態。
         奇怪嗎?不是已經start了嗎?為什麼不稱為“running”狀態呢?其實是有原因的。因為我們的電腦一般是不具有真正平行處理能力的。我們所謂的多線程只是把時間分成片段,然後隔一個時間段就讓一個線程執行一下,然後進入“sleeping ”狀態,然後喚醒另一個在“sleeping”的線程,如此迴圈runnable->sleeping->runnable... ,只是因為電腦執行速度很快,而時間片段間隔很小,我們感受不到,以為是同時進行的。所以說一個線程在start了之後只是處在了可以啟動並執行狀態,他什麼時候運行還是由系統來進行調度的。
         那一個線程什麼時候會“dead”呢?一般來說當線程對象的run方法執行結束或者在執行中拋出異常的話,那麼這個線程就會結束了。系統會自動對“dead”狀態線程進行清理。
程式:

import threading
import time

class MyThread(threading.Thread):
    def __init__(self, threadname):
        threading.Thread.__init__(self, name=threadname)

    def run(self):
        for i in range(10):
            print self.getName(), i
            time.sleep(1)

t1 = MyThread('t1')
t1.start()

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.