python线程join函数卡死_Python多线程学习——join()函数的理解

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早

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值