#Python中調用_thread模塊中的start_new_thread()函數產生新線程。_thread的語法如下:
1 _thread.start_new._thread(function,args[,kwargs])
#其中,function為線程函數:args為傳遞給線程函數的參數,必須是tuple類型;kwargs為可選參數。
#_thread模塊除了產生線程外,還提供基本同步數據結構鎖對象(lock object,也叫原語鎖、簡單鎖、互斥鎖、互斥量、二值信號量)。同步原語與線程管理是密不可分的。
#我們來看如下示例:
1 #!/usr/bin/python3 2 #-*-coding:UTF-8-*- 3 #_thread 4 5 import _thread 6 from time import sleep 7 from datetime import datetime 8 9 10 date_time_format='%y-%M-%d %H:%M:%S' 11 12 def date_time_str(date_time): 13 return datetime.strftime(date_time,date_time_format) 14 15 def loop_one(): 16 print('+++線程一開始於:',date_time_str(datetime.now())) 17 print('+++線程一休眠4秒') 18 sleep(4) 19 print('+++線程一休眠結束,結束於:',date_time_str(datetime.now())) 20 21 def loop_two(): 22 print('***線程二開始於:',date_time_str(datetime.now())) 23 print('***線程二休眠2秒') 24 sleep(2) 25 print('***線程二結束休眠,結束於:',date_time_str(datetime.now())) 26 27 def main(): 28 print('-----所有線程開始時間:',date_time_str(datetime.now())) 29 _thread.start_new_thread(loop_one,()) 30 _thread.start_new_thread(loop_two,()) 31 sleep(6) 32 print('-----所有線程結束時間:',date_time_str(datetime.now())) 33 34 if __name__=='__main__': 35 main()
#執行結果如下:
1 D:\Python\workspace\datatime\20180123>python _thread.py 2 -----所有線程開始時間: 18-01-23 21:01:22 3 ***線程二開始於: 18-01-23 21:01:22 4 +++線程一開始於: 18-01-23 21:01:22 5 ***線程二休眠2秒 6 +++線程一休眠4秒 7 ***線程二結束休眠,結束於: 18-01-23 21:01:24 8 +++線程一休眠結束,結束於: 18-01-23 21:01:26 9 -----所有線程結束時間: 18-01-23 21:01:28
#_thread模塊提供了簡單的多線程機制,兩個循環並發執行,總的運行時間為最慢的線程的運行時間(主線程6s),而不是所有線程的運行時間之和。start_new_thread()要求至少傳兩個參數,即使想要運行的函數不要參數,也要傳一個空元組。
#sleep(6)是讓主線程停下來。主線程一旦運行結束,就關閉運行着的其他兩個線程。這可能造成主線程過早或過晚退出,這時就要使用線程鎖,主線程可認在兩個子線程都退出后立即退出。
#示例代碼如下:
1 #!/usr/bin/python3 2 #-*-coding:UTF-8-*- 3 #_thread 4 5 import _thread 6 from time import sleep 7 from datetime import datetime 8 9 loops=[4,2] 10 date_time_format='%y-%M-%d %H:%M:%S' 11 12 def date_time_str(date_time): 13 return datetime.strftime(date_time,date_time_format) 14 15 def loop(n_loop,n_sec,lock): 16 print('線程(',n_loop,')開始執行:,date_time_str(datetime.now()),先休眠(',n_sec,')秒') 17 sleep(n_sec) 18 print('線程(',n_loop,')休眠結束,結束於:',date_time_str(datetime.now())) 19 lock.release() 20 21 def main(): 22 print('---所有線程開始執行...') 23 locks=[] 24 n_loops=range(len(loops)) 25 26 for i in n_loops: 27 lock=_thread.allocate_lock() 28 lock.acquire() 29 locks.append(lock) 30 31 for i in n_loops: 32 _thread.start_new_thread(loop,(i,loops[i],locks[i])) 33 34 for i in n_loops: 35 while locks[i].locked(): 36 pass 37 38 print('---所有線程執行結束:',date_time_str(datetime.now())) 39 40 if __name__=='__main__': 41 main()
#執行結果如下:
1 D:\Python\workspace\datatime\20180123>python _thread.py 2 ---所有線程開始執行... 3 線程( 0 )開始執行:,date_time_str(datetime.now()),先休眠( 4 )秒 4 線程( 1 )開始執行:,date_time_str(datetime.now()),先休眠( 2 )秒 5 線程( 1 )休眠結束,結束於: 18-02-23 23:02:30 6 線程( 0 )休眠結束,結束於: 18-02-23 23:02:32 7 ---所有線程執行結束: 18-02-23 23:02:32
#可以看到,以上代碼使用了線程鎖。