前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >十、python学习笔记-线程-线程的start和join

十、python学习笔记-线程-线程的start和join

原创
作者头像
堕落飞鸟
发布2022-01-17 13:16:06
1.2K0
发布2022-01-17 13:16:06
举报
文章被收录于专栏:飞鸟的专栏
代码语言:javascript
复制
"""
1、线程的start方法执行线程。
2、join方法阻塞主线程,需要等待对应的子线程结束后再继续执行主线程。
"""
import threading
import time
"""
1、定义函数foo1,打印循环是第几环个线程。
2、我们在函数foo1中增加不同的sleep时间来证明是多线程并发执行的(如果是并行会按照执行完成的先后顺序打印,
   如果是串行会按照123的顺序打印)
3、创建空列表p_list,将三个子线程放入该列表,用于执行join
4、创建3个子线程执行foo函数传递循环次数i
5、执行子线程(start)
6、执行阻塞(join)
"""


def foo1(n):
    m_list = [3, 2, 1]
    time.sleep(m_list[n-1])
    print('这是第{}个线程'.format(n))


if __name__ == '__main__':
    t_list = []
    for i in range(1, 4):
        t = threading.Thread(target=foo1, args=(i,))
        t.start()
        t_list.append(t)

    for j in t_list:
        j.join()


"""疑问:为什么要先通过循环执行3个子线程,再通过循环阻塞
1、因为join会阻塞主线程,如果执行一个子线程就阻塞,就会导致三个线程不是并发执行的而是串行的。
2、看下面的例子,我们将start和join放在一个循环中,这样就会先执行一个线程的start和join,然后在循环执行下一个线程。
3、可以看到他们的输出结果,永远都是1,2,3。说明是串行的。
"""


def foo2(n):
    m_list = [3, 2, 1]
    time.sleep(m_list[n-1])
    print('这是第{}个线程'.format(n))


if __name__ == '__main__':
    for i in range(1, 4):
        p = threading.Thread(target=foo2, args=(i,))
        p.start()
        p.join()

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档