一.多线程相关python包/模块
1.thread
该模块有问题,使用不便,在python3中被保留,并且改成了_thread
2.threading
python3中通用的多线程包
二.什么是多线程
案例1:
无多线程程序代码
1 importtime2
3 defloop1():4 print('loop1 begining:',time.ctime())5 time.sleep(4)6 print('loop1 ending:',time.ctime())7
8 defloop2():9 print('loop2 begining:',time.ctime())10 time.sleep(2)11 print('loop2 ending:',time.ctime())12
13 defmain():14 print('main beginging',time.ctime())15 loop1()16 loop2()17 print('main ending',time.ctime())18
19 if __name__ == '__main__':20 main()
main beginging Wed Aug 22 21:33:34 2018loop1 begining: Wed Aug22 21:33:34 2018loop1 ending: Wed Aug22 21:33:38 2018loop2 begining: Wed Aug22 21:33:38 2018loop2 ending: Wed Aug22 21:33:40 2018main ending Wed Aug22 21:33:40 2018
out1
案例2:
含有多线程程序代码1
1 importtime2 import_thread as thread3
4 defloop1():5 print('loop1 begining:',time.ctime())6 time.sleep(4)7 print('loop1 ending:',time.ctime())8
9 defloop2():10 print('loop2 begining:',time.ctime())11 time.sleep(2)12 print('loop2 ending:',time.ctime())13
14 defmain():15 print('main beginging:',time.ctime())16 thread.start_new_thread(loop1,())17 thread.start_new_thread(loop2,())18 print('main ending:',time.ctime())19
20 if __name__ == '__main__':21 main()
main beginging: Wed Aug 22 21:35:07 2018main ending: Wed Aug22 21:35:07 2018
out2
启动多线程函数:start_new_thead
参数两个,一个是需要运行的函数名,第二是函数的参数作为元祖使用,为空则使用空元祖
注意:如果函数只有一个参数,需要参数后由一个逗号
案例中,main函数执行完,程序立刻退出.loop1,loop2并没有执行完
main函数相当于包工头
loop1,loop2相当于工人
main函数(包工头)分配loop1,loop2(工人)任务之后,立刻报告给boss,没有等loop1,loop2完成各自的任务
案例3:
含有多线程程序代码2-改进版
1 importtime2 import_thread as thread3
4 defloop1():5 print('loop1 begining:',time.ctime())6 time.sleep(4)7 print('loop1 ending:',time.ctime())8
9 defloop2():10 print('loop2 begining:',time.ctime())11 time.sleep(2)12 print('loop2 ending:',time.ctime())13
14 defmain():15 print('main beginging:',time.ctime())16 thread.start_new_thread(loop1,())17 thread.start_new_thread(loop2,())18 print('main ending:',time.ctime())19
20 if __name__ == '__main__':21 main()22 whileTrue:23 time.sleep(1)
main beginging: Wed Aug 22 21:45:10 2018main ending: Wed Aug22 21:45:10 2018loop1 begining: Wed Aug22 21:45:10 2018loop2 begining: Wed Aug22 21:45:10 2018loop2 ending: Wed Aug22 21:45:12 2018loop1 ending: Wed Aug22 21:45:14 2018
out3
在改进案例中:
增加while True: // time.sleep()
while True:无限循环
这样就避免了程序在main函数执行完后立刻退出,使得loop1,loop2得以执行
案例4:
含有多线程程序代码3-带参数
1 from time importctime,sleep2 import_thread as thread3
4 defloop1(x):5 print('loop1 begining:',ctime())6 sleep(4)7 print('LOOP1:I am {0}'.format(x))8 print('loop1 ending:',ctime())9
10 defloop2(x,y):11 print('loop2 begining:',ctime())12 sleep(2)13 print('LOOP2:I am {0}\nLOOP2:I am {1}'.format(x,y))14 print('loop2 ending:',ctime())15
16 defmain():17 print('main begining:',ctime())18 thread.start_new_thread(loop1,('Jone',))19 thread.start_new_thread(loop2,('Tom','king'))20 print('main ending:',ctime())21
22 if __name__ == '__main__':23 main()24 whileTrue:25 sleep(1)
三.threading模块的使用
案例1:
1 importtime2 importthreading3
4 defloop1(x):5 print('loop1 start:',time.ctime())6 print('LOOP1:I am',x)7 time.sleep(4)8 print('loop1 end:',time.ctime())9
10 defloop2(x,y):11 print('loop2 start:',time.ctime())12 print('LOOP2:I am',x)13 print('LOOP2:I am',y)14 time.sleep(2)15 print('loop2 end:',time.ctime())16
17 defmain():18 print('main start:',time.ctime())19 t1 = threading.Thread(target = loop1,args = ('JONE',))20 t2 = threading.Thread(target = loop2,args = ('KIMI','SUKI'))21 t1.start()22 t2.start()23 print('main end:',time.ctime())24 if __name__ == '__main__':25 main()
main start: Wed Aug 22 23:41:38 2018loop1 st