_thread模塊


#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
#可以看到,以上代碼使用了線程鎖。


免責聲明!

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



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