_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
#可以看到,以上代码使用了线程锁。