什么是線程
線程是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!!!
***********************************************************
學習永遠不晚。——高爾基
***********************************************************