Python3入門之線程實例常用方法及屬性設置


什么是線程

    線程是CPU分配資源的基本單位。但一個程序開始運行,這個程序就變成了一個進程,而一個進程相當於一個或者多個線程。當沒有多線程編程時,一個進程也是一個主線程,但有多線程編程時,一個進程包含多個線程,包括主線程。使用線程可以實現程序的並發。

python3中線程模塊

    python3對多線程支持的是 threading 模塊,應用這個模塊可以創建多線程程序,並且在多線程間進行同步和通信。在python3 中,可以通過兩種方法來創建線程(下面列子將以直接在線程中運行函數為主):

    1.用 threading.Thread 直接在線程中運行函數

import time
import threading

def thread_run(name):
    print("%s's first thread!!!"% name)
    time.sleep(5)

mike = threading.Thread(target=thread_run, args=('Mike', ))
jone = threading.Thread(target=thread_run, args=('jone', ))

mike.start()
jone.start()

    2.通過繼承 threading.Thread 類 來創建線程 

import time
import threading

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

    def run(self):
        print("%s's first thread!!!"% self.name)
        time.sleep(5)

mike = mythread('mike')
jone = mythread('jone')

mike.start()
jone.start()

線程threading.Thread實例常用方法

可以通過help(threading.Thread)查看線程實例所有方法

1. start()

    help解釋:Start the thread's activity

    啟動線程

2. join()

    help解釋:Wait until the thread terminates

    阻塞線程直至線程終止,然后在繼續運行

import time
import threading

def thread_run(name):
    time.sleep(2)
    print("%s's first thread!!!"% name)


mike = threading.Thread(target=thread_run, args=('Mike', ))
jone = threading.Thread(target=thread_run, args=('jone', ))

mike.start()
jone.start()
mike.join()    #阻塞子線程mike直到mike線程執行完畢
jone.join()    #阻塞子線程jone直到jone線程執行完畢
print('main thread is running!!!')

執行結果:
jone's first thread!!!
Mike's first thread!!!
main thread is running!!!

    如果上面列子不執行join(),主線程先執行,然后才會執行子線程mike和jone

import time
import threading

def thread_run(name):
    time.sleep(2)
    print("%s's first thread!!!"% name)


mike = threading.Thread(target=thread_run, args=('Mike', ))
jone = threading.Thread(target=thread_run, args=('jone', ))

mike.start()
jone.start()
#mike.join()    #阻塞子線程mike
#jone.join()    #阻塞子線程jone
print('main thread is running!!!')
執行結果:
main thread is running!!!
jone's first thread!!!
Mike's first thread!!!

3. isAlive = is_alive(self)

    help解釋:Return whether the thread is alive.

    這個方法用於判斷線程是否運行。

        1.當線程未調用 start()來開啟時,isAlive()會返回False

        2.但線程已經執行后並結束時,isAlive()也會返回False

import time
import threading

def thread_run(name):
    time.sleep(2)
    print("%s's first thread!!!"% name)


mike = threading.Thread(target=thread_run, args=('Mike', ))
jone = threading.Thread(target=thread_run, args=('jone', ))

mike.start()
jone.start()
print('isAlive status: %s'% mike.isAlive())
print('is_alive status: %s' %mike.is_alive())
print('main thread is running!!!')
執行結果:
isAlive status: True
is_alive status: True
main thread is running!!!
Mike's first thread!!!
jone's first thread!!!

4. name

    help解釋:A string used for identification purposes only.

    name屬性表示線程的線程名 默認是 Thread-x  x是序號,由1開始,第一個創建的線程名字就是 Thread-1

import time
import threading

def thread_run(name):
    print("%s's first thread!!!"% name)
    time.sleep(5)

mike = threading.Thread(target=thread_run, args=('Mike', ), name='Thread-mike')    #name設置線程名
jone = threading.Thread(target=thread_run, args=('jone', ))    #默認線程name是Thread-X

mike.start()
jone.start()
print(mike.name)    #打印線程名
print(jone.name)    #打印線程名
執行結果:
Mike's first thread!!!
jone's first thread!!!
Thread-mike
Thread-1

5. setName()

    用於設置線程的名稱name

import time
import threading

def thread_run(name):
    print("%s's first thread!!!"% name)
    time.sleep(5)

mike = threading.Thread(target=thread_run, args=('Mike', ))
jone = threading.Thread(target=thread_run, args=('jone', ))    #默認線程name是Thread-X
 mike.setName('Thread-mike')    #name設置線程名
mike.start()
jone.start()
print(mike.name)    #打印線程名
print(jone.name)    #打印線程名
執行結果:
Mike's first thread!!!
jone's first thread!!!
Thread-mike
Thread-2

6. getName()

    獲取線程名稱name

import time
import threading

def thread_run(name):
    print("%s's first thread!!!"% name)
    time.sleep(5)

mike = threading.Thread(target=thread_run, args=('Mike', ))
jone = threading.Thread(target=thread_run, args=('jone', ))    #默認線程name是Thread-X

mike.setName('Thread-mike')    #name設置線程名
mike.start()
jone.start()
print(mike.getName())    #打印線程名
print(jone.getName())    #打印線程名

7. daemon

    help解釋:A boolean value indicating whether this thread is a daemon thread

    當 daemon = False 時,線程不會隨主線程退出而退出(默認時,就是 daemon = False)

    當 daemon = True 時,當主線程結束,其他子線程就會被強制結束

import time
import threading

def thread_mike_run(name):
    time.sleep(1)
    print('mike thread is running 1S')
    time.sleep(5)
    print("%s's first thread!!!"% name)

def thread_jone_run(name):
    time.sleep(2)
    print("%s's first thread!!!"% name)


mike = threading.Thread(target=thread_mike_run, args=('Mike', ), daemon=True)    #設置daemon為True
#mike = threading.Thread(target=thread_mike_run, args=('Mike', ))
jone = threading.Thread(target=thread_jone_run, args=('jone', ))


mike.start()
jone.start()
print('main thread')    #由於線程沒有join(),所以主線程會先運行;而jone的daemon為false,所以主線程會等待jone線程運行完畢;但是mike的daemon為True,所以主線程不會等待mike線程
執行結果:
main thread
mike thread is running 1S #mike線程只執行了1S的print,5S的為執行就直接退出了
jone's first thread!!!

8. setDaemon()

    用於設置daemon值

import time
import threading

def thread_mike_run(name):
    time.sleep(1)
    print('mike thread is running 1S')
    time.sleep(5)
    print("%s's first thread!!!"% name)

def thread_jone_run(name):
    time.sleep(2)
    print("%s's first thread!!!"% name)


mike = threading.Thread(target=thread_mike_run, args=('Mike', ))
jone = threading.Thread(target=thread_jone_run, args=('jone', ))

mike.setDaemon(True) #設置daemon為True
mike.start()
jone.start()
print('main thread')    #由於線程沒有join(),所以主線程會先運行;而jone的daemon為false,所以主線程會等待jone線程運行完畢;但是mike的daemon為True,所以主線程不會等待mike線程
執行結果:
main thread
mike thread is running 1S
jone's first thread!!!

 

 

***********************************************************

 學習永遠不晚。——高爾基

***********************************************************


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM