標籤:添加 odi cti 定義 筆記 封裝 案例 多線程 target
前言
1.python環境2.7
2.threading模組系統內建
單線程
1.平常寫的代碼都是按順序挨個執行的,就好比吃火鍋和哼小曲這兩個行為事件,定義成兩個函數,執行的時候,是先吃火鍋再哼小曲,這種就是單線程的行為。
# coding:utf-8import timedef chi(): print("%s 吃火鍋開始:" % time.ctime()) time.sleep(1) print("%s 吃火鍋結束--" % time.ctime())def heng(): print("%s 哼著小曲開始:" % time.ctime()) time.sleep(1) print("%s 哼著小曲結束--" % time.ctime())if __name__ == "__main__": chi() heng()Thu Jan 11 16:32:37 2018 吃火鍋開始:Thu Jan 11 16:32:38 2018 吃火鍋結束--Thu Jan 11 16:32:38 2018 哼著小曲開始:Thu Jan 11 16:32:39 2018 哼著小曲結束--
2.生活中我們是可以一邊吃火鍋一邊哼小曲的,那麼代碼裡面如何?這種同時進行的不同事件呢?這就是接下來要講的python多線程
多線程threading
1.Python通過兩個標準庫thread和threading提供對線程的支援。thread提供了低層級的、原始的線程以及一個簡單的鎖.Threading模組封裝了一些常用的方法,初學者直接學這個模組就行了。
2.Python中使用線程有兩種方式:函數或者用類來封裝線程對象
3.threading.Thread裡面幾個參數介紹:
class Thread(_Verbose) __init__(self, group=None, target=None, name=None, args=(), kwargs=None, verbose=None) *group*:group參數必須為空白,參數group是預留的,用於將來擴充; 參數args和kwargs分別表示調用target時的參數列表和關鍵字參數。 *target*: 參數target是一個可調用對象(也稱為活動[activity]),線上程啟動後執行 *name*: 參數name是線程的名字。預設值為“Thread-N“,N是一個數字。 *args*:傳遞給線程函數target的參數,他必須是個tuple類型. *kwargs*:kwargs表示關鍵字參數。字典類型 {}.
函數式
1.先看個簡單案例,這種是執行函數,函數不帶參數的
# coding:utf-8import threadingimport timedef chi(): print("%s 吃著火鍋開始:" % time.ctime()) time.sleep(1) print("%s 吃著火鍋:涮羊肉" % time.ctime()) time.sleep(1) print("%s 吃著火鍋:涮牛肉" % time.ctime()) time.sleep(1) print("%s 吃著火鍋:貢丸" % time.ctime()) time.sleep(1) print("%s 吃火鍋結束!" % time.ctime())def ting(): print("%s 哼著小曲1!" % time.ctime()) time.sleep(2) print("%s 哼著小曲2!" % time.ctime()) time.sleep(2) print("%s 哼著小曲3!" % time.ctime()) time.sleep(2) print("%s 哼著小曲4!" % time.ctime()) time.sleep(2) print("%s 哼著小曲5!" % time.ctime()) time.sleep(2)# 建立線程數組threads = []# 建立線程t1,並添加到線程數組t1 = threading.Thread(target=chi)threads.append(t1)# 建立線程t2,並添加到線程數組t2 = threading.Thread(target=ting)threads.append(t2)if __name__ == ‘__main__‘: # 啟動線程 for t in threads: t.start()
運行結果:
Thu Jan 11 16:35:50 2018 吃著火鍋開始:
Thu Jan 11 16:35:50 2018 哼著小曲1!
Thu Jan 11 16:35:51 2018 吃著火鍋:涮羊肉
Thu Jan 11 16:35:52 2018 哼著小曲2!Thu Jan 11 16:35:52 2018 吃著火鍋:涮牛肉
Thu Jan 11 16:35:53 2018 吃著火鍋:貢丸
Thu Jan 11 16:35:54 2018 哼著小曲3!Thu Jan 11 16:35:54 2018 吃火鍋結束!
Thu Jan 11 16:35:56 2018 哼著小曲4!
Thu Jan 11 16:35:58 2018 哼著小曲5!
2.帶參數的用args傳元群組類型(參數最後多加一個逗號“,”要不然會報錯)
# coding:utf-8import threadingimport timedef chi(threadName,name): print("%s 吃著%s開始:" % (time.ctime(),threadName)) print("%s 吃著火鍋:涮羊肉" % time.ctime()) time.sleep(1) time.sleep(1) print("%s 吃著火鍋:涮牛肉" % time.ctime()) time.sleep(1) print("%s 吃著火鍋:貢丸" % time.ctime()) time.sleep(1) print("%s 吃著%s結束--" % (time.ctime(),threadName)) print("%s 運行結束!"%name)def ting(threadName): print("%s 哼著%s1!" % (time.ctime(),threadName)) time.sleep(2) print("%s 哼著小曲2!" % time.ctime()) time.sleep(2) print("%s 哼著小曲3!" % time.ctime()) time.sleep(2) print("%s 哼著小曲4!" % time.ctime()) time.sleep(2) print("%s 哼著小曲5!" % time.ctime()) time.sleep(2)# 建立線程數組threads = []# 建立線程t1,並添加到線程數組# t1 = threading.Thread(target=chi, args=("火鍋","吃火鍋",))# 傳kwargs參數t1 = threading.Thread(target=chi, kwargs={"threadName":"火鍋","name":"吃火鍋"})threads.append(t1)# 建立線程t2,並添加到線程數組t2 = threading.Thread(target=ting,args=("小曲",))threads.append(t2)if __name__ == ‘__main__‘: # 啟動線程 for t in threads: t.start()
3.或者用kwargs傳字典{}類型
# 建立線程t1,並添加到線程數組# t1 = threading.Thread(target=chi, args=("火鍋","吃火鍋",))# 傳kwargs參數t1 = threading.Thread(target=chi, kwargs={"threadName":"火鍋","name":"吃火鍋"})
封裝類和方法的調用下篇介紹
python筆記7-多線程threading之函數式