多线程——join()功能

1.不加 join() 的结果

我们让 Thread1 线程工作的耗时增加.

import time

def thread_job():
    print('===============Thread1 Starting====================\n')
    for i in range(10):
        time.sleep(1)
    print('====================Thread1 Finished===============\n')

def main():
    added_thread = threading.Thread(target = thread_job, name = 'Thread1')
    added_thread.start()
    print('===============All Have Been Done==================\n')


if __name__ == "__main__":
    main()

在这里插入图片描述
预想中输出的结果是否为:
=Thread1 Starting======
Thread1 Finished=
=All Have Been Done

但实际确为:
=Thread1 Starting
====
=All Have Been Done====
======Thread1 Finished=

2.加入 join() 的结果

线程任务还未完成便输出All Have Been Done。如果要遵循顺序,可以在启动线程后对它调用join:

added_thread.start()
added_thread.join()
print("===============All Have Been Done==================\n")
import threading
import time

def thread_job():
    print('===============Thread1 Starting====================\n')
    for i in range(10):
        time.sleep(1)
    print('====================Thread1 Finished===============\n')

def main():
    added_thread = threading.Thread(target = thread_job, name = 'Thread1')
    added_thread.start()
    added_thread.join()
    print('===============All Have Been Done==================\n')


if __name__ == "__main__":
    main()

在这里插入图片描述
使用join对控制多个线程的执行顺序非常关键。举个例子,假设我们现在再加一个线程Thread2,Thread2的任务量较小,会比Thread1更快完成:

import threading
import time

def thread_job():
    print('===============Thread1 Starting====================\n')
    for i in range(10):
        time.sleep(1)
    print('====================Thread1 Finished===============\n')

def thread2_job():
    print('===============Thread2 Starting====================\n')
    print('====================Thread2 Finished===============\n')

def main():
    added_thread = threading.Thread(target = thread_job, name = 'Thread1')
    added_thread2 = threading.Thread(target = thread2_job, name = 'Thread2')
    added_thread.start()
    added_thread2.start()
    #added_thread.join()
    print('===============All Have Been Done==================\n')


if __name__ == "__main__":
    main()

在这里插入图片描述
现在Thread1和Thread2都没有join,注意这里说”一种”是因为All Have Been Done的出现完全取决于两个线程的执行速度, 完全有可能Thread2 finish出现在All Have Been Done之后。这种杂乱的执行方式是我们不能忍受的,因此要使用join加以控制。

我们试试在Thread1启动后,Thread2启动前加上thread_1.join():

import threading
import time

def thread_job():
    print('===============Thread1 Starting====================\n')
    for i in range(10):
        time.sleep(1)
    print('====================Thread1 Finished===============\n')

def thread2_job():
    print('===============Thread2 Starting====================\n')
    print('====================Thread2 Finished===============\n')

def main():
    added_thread = threading.Thread(target = thread_job, name = 'Thread1')
    added_thread2 = threading.Thread(target = thread2_job, name = 'Thread2')
    added_thread.start()
    added_thread.join()
    added_thread2.start()
    #added_thread.join()
    print('===============All Have Been Done==================\n')


if __name__ == "__main__":
    main()

在这里插入图片描述
可以看到,Thread2会等待Thread1结束后才开始运行。
如果我们在Thread2启动后放上added_thread.join()会怎么样呢?
在这里插入图片描述
Thread2在Thread1之后启动,并且因为Thread2任务量小会在Thread1之前完成;而Thread1也因为加了join,All Have Been Done在它完成后才显示。
你也可以添加thread_2.join()进行尝试,但为了规避不必要的麻烦,推荐如下这种1221的V型排布:

import threading
import time

def thread_job():
    print('===============Thread1 Starting====================\n')
    for i in range(10):
        time.sleep(1)
    print('====================Thread1 Finished===============\n')

def thread2_job():
    print('===============Thread2 Starting====================\n')
    print('====================Thread2 Finished===============\n')

def main():
    added_thread = threading.Thread(target = thread_job, name = 'Thread1')
    added_thread2 = threading.Thread(target = thread2_job, name = 'Thread2')
    added_thread.start()
    added_thread2.start()
    added_thread2.join()
    added_thread.join()
    print('===============All Have Been Done==================\n')


if __name__ == "__main__":
    main()
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值