# 多線程python
# 一個進程至關於一個或多個線程編程
# 當沒有多線程編程時,一個進程也是一個主線程多線程
# 但有多線程編程時,一個進程包含多個線程,包括主線程併發
# 使用線程 能夠實現程序的併發函數
# python3中多多線程支持的是threading模塊操作系統
# import threading線程
# 在python3中,能夠經過兩種方法來建立線程對象
'''
兩種方法:繼承
① 使用threading.Thread直接在線程中運行函數(調用Thread類的構造器建立線程)。生命週期
target參數:傳入一個函數對象(函數名);
args參數:傳入一個元組,做爲目標函數的入參;
步驟以下:
1 - 調用Thread類的構造器建立線程對象,在建立對象時,target參數指定的函數將做爲線程執行體
2 - 調用線程對象的star()方法啓動該線程
② 繼承Thread類建立線程類。
步驟以下:
1 - 定義Thread類的子類,並重寫該類的run()方法,run()方法的方法體就表明了線程須要完成的任務,所以把run()方法稱爲線程執行體
2 - 建立Thread子類的實例,即建立線程對象
3 -調用線程對象的star()方法來啓動線程
推薦使用第一種方式來建立線程,這種方式編程簡單,線程直接包裝target函數,具備更清晰的邏輯結構
'''
# 如何獲取主線程的名稱
# threading.current_thread().getName()
# 線程的調度方式
# start方法 啓動線程
# join方法 等待線程
import threading
import time
def thread_run(name):
time.sleep(2)
print("%s first thread!!!" % name)
t1 = threading.Thread(target=thread_run, args=('peiyanan', ))
t2 = threading.Thread(target=thread_run, args=('tanyongling', ))
t1.start()
t2.start()
t1.setName('子線程1') # 設置線程的名稱name
print(t1.name) # 打印線程名
print(t1.getName()) # 獲取線程名稱
print(t1.is_alive()) # isalive()方法用於判斷線程是否運行 未運行會顯示False
# t1.join()
# t2.join()
# print('主線程正在運行!!')
# -------------------------------------------------------
# 如何優雅的使用多線程
# 能夠使用for循環來控制建立線程的數量
# menu = ['數學', '英語', '語文', '地理', '歷史']
# for m in menu:
# t = threading.Thread(target=thread_run, args=(m, 2))
# t.start()
# 線程調度
# 操做系統不會讓一個線程一直佔用CPU的
# 線程的生命週期
'''
四個狀態:
①新建狀態 指該線程已經初始化,但還沒啓動
②運行狀態 指線程的正常執行狀態
③阻塞狀態 指線程處於執行狀態,但因爲沒有得到CPU的執行時間,而處在CPU外部等待線程執行的狀態
④死亡狀態 指線程執行結束
'''
# 使用線程須要注意到的點''' 線程獨有的資源 調用的函數局部變量,線程都會有個本身的拷貝 不會衝突 線程有時會給開發上帶來麻煩:如 共享數據的訪問,好比全局變量'''