_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
#可以看到,以上代码使用了线程锁。
posted @ 2018-02-02 08:44  爱你无目的  阅读(1910)  评论(0编辑  收藏  举报