Python3 多线程
多线程类似于同时执行多个不同程序,多线程运行有如下优点:
使用线程可以把占据长时间的程序中的任务放到后台去处理。
用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。
程序的运行速度可能加快。
在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。
Python3 线程中常用的两个模块为:
_thread
threading
这里使用的是threading
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
@Time : 2019/1/16 10:28
@File : test_join.py
@Author : frank.chang@shoufuyou.com
refer :
# Youtube video tutorial: https://www.youtube.com/channel/UCdyjiB5H8Pu7aDTNVXTTpcg
# Youku video tutorial: http://i.youku.com/pythontutorial
https://github.com/MorvanZhou/tutorials/blob/master/threadingTUT/thread3_join.py
"""
import threading
import time
def T1_job():
print('T1 start')
for i in range(10):
print('T1 begin sleep 0.1s')
time.sleep(0.1)
print('T1 finish')
def T2_job():
print('T2 start')
time.sleep(1)
print('T2 finish')
def main():
print('---main begin----')
#创建新线程
t1 = threading.Thread(target=T1_job, name='T1')
t2 = threading.Thread(target=T2_job, name='T2')
#启动新线程
t1.start()
t2.start()
print('\n---main end----')
if __name__ == '__main__':
main()
运行结果为
---main begin----
T1 start
T1 begin sleep 0.1s
T2 start
---main end----
T1 begin sleep 0.1s
T1 begin sleep 0.1s
T1 begin sleep 0.1s
T1 begin sleep 0.1s
T1 begin sleep 0.1s
T1 begin sleep 0.1s
T1 begin sleep 0.1s
T1 begin sleep 0.1s
T1 begin sleep 0.1s
T2 finish
T1 finish
这里T1和T2线程都没有结束 但是主线程结束了。现在就体现出了join()的作用。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
@Time : 2019/1/16 10:28
@File : test_join.py
@Author : frank.chang@shoufuyou.com
refer :
# Youtube video tutorial: https://www.youtube.com/channel/UCdyjiB5H8Pu7aDTNVXTTpcg
# Youku video tutorial: http://i.youku.com/pythontutorial
https://github.com/MorvanZhou/tutorials/blob/master/threadingTUT/thread3_join.py
"""
import threading
import time
def T1_job():
print('T1 start')
for i in range(10):
print('T1 begin sleep 0.1s')
time.sleep(0.1)
print('T1 finish')
def T2_job():
print('T2 start')
time.sleep(1)
print('T2 finish')
def main():
print('---main begin----')
#创建新线程
t1 = threading.Thread(target=T1_job, name='T1')
t2 = threading.Thread(target=T2_job, name='T2')
#启动新线程
t1.start()
t2.start()
t1.join()
t2.join()
print('\n---main end----')
if __name__ == '__main__':
main()
运行结果:
---main begin----
T1 start
T1 begin sleep 0.1s
T2 start
T1 begin sleep 0.1s
T1 begin sleep 0.1s
T1 begin sleep 0.1s
T1 begin sleep 0.1s
T1 begin sleep 0.1s
T1 begin sleep 0.1s
T1 begin sleep 0.1s
T1 begin sleep 0.1s
T1 begin sleep 0.1s
T2 finish
T1 finish
---main end----
加了t1.join()和t2.join()之后 “---main end----” (也就是主线程)等待T1和T2都结束后才继续运行。但是这里你可那个有疑惑t1.join()在t2.join()之前 为什么T2 finish 比T1早?再来一段代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
@Time : 2019/1/16 10:28
@File : test_join.py
@Author : frank.chang@shoufuyou.com
refer :
# Youtube video tutorial: https://www.youtube.com/channel/UCdyjiB5H8Pu7aDTNVXTTpcg
# Youku video tutorial: http://i.youku.com/pythontutorial
https://github.com/MorvanZhou/tutorials/blob/master/threadingTUT/thread3_join.py
"""
import threading
import time
def T1_job():
print('T1 start')
for i in range(10):
print('T1 begin sleep 0.1s')
time.sleep(0.1)
print('T1 finish')
def T2_job():
print('T2 start')
time.sleep(1)
print('T2 finish')
def main():
print('---main begin----')
#创建新线程
t1 = threading.Thread(target=T1_job, name='T1')
t2 = threading.Thread(target=T2_job, name='T2')
#启动新线程
t1.start()
t2.start()
t1.join()
print("T1 完成")
t2.join()
print("T2 完成")
print('\n---main end----')
if __name__ == '__main__':
main()
运行结果:
---main begin----
T1 start
T1 begin sleep 0.1s
T2 start
T1 begin sleep 0.1s
T1 begin sleep 0.1s
T1 begin sleep 0.1s
T1 begin sleep 0.1s
T1 begin sleep 0.1s
T1 begin sleep 0.1s
T1 begin sleep 0.1s
T1 begin sleep 0.1s
T1 begin sleep 0.1s
T2 finish
T1 finish
T1 完成
T2 完成
---main end----
t1.join() 跑完之后, t1 就完成了. 然后执行t2.join(), 等待t2线程跑完, 其实它早已经跑完了.所以T2 finish早