python 线程thread详解

join详解

看到代码示例时,都会出现一个join,这个作用如何?先看结论

  1. 阻塞主程序,专注于执行多线程中的程序

  2. 多线程多join的情况下,依次执行各线程的join方法,子线程全部结束了才能执行主线程。

  3. join无入参,则等待到该执行绪结束,才开始执行下一个线程的join。

  4. 入参timeout为线程的阻塞时间,如timeout=2 就是按照着这个线程2s 以后,就不管他了,继续执行下面的程序。

观察下面的代码,

import threading, time

def worker(interval):
    print("worker start at "+time.strftime('%H:%M:%S'))
    time.sleep(interval)
    print('finish worker, ',time.strftime('%H:%M:%S'))


def master(interval):
    print("master start at "+time.strftime('%H:%M:%S'))
    time.sleep(interval)
    print('finish master, ', time.strftime('%H:%M:%S'))

if __name__ == '__main__':
    ts = []
    t1 = threading.Thread(target=worker, args=(3,))
    t2 = threading.Thread(target=master, args=(5,))
    ts.append(t1)
    ts.append(t2)
    t2.start()
    t1.start()
  
    print('End main thread, '+time.strftime('%H:%M:%S'))

代码里没有join时,上述有起了三个线程,分别是main,t1,t2,他们会各自同时并发执行各自的代码

master start at 16:29:08
worker start at 16:29:08
End main thread, 16:29:08
finish worker,  16:29:11
finish master,  16:29:13

如果我们加上join,原本各自为政的三个线程,就有了秩序

import threading, time

def worker(interval):
    print("worker start at "+time.strftime('%H:%M:%S'))
    time.sleep(interval)
    print('finish worker, ',time.strftime('%H:%M:%S'))
def master(interval):
    print("master start at "+time.strftime('%H:%M:%S'))
    time.sleep(interval)
    print('finish master, ', time.strftime('%H:%M:%S'))

if __name__ == '__main__':
    ts = []
    t1 = threading.Thread(target=worker, args=(3,))
    t2 = threading.Thread(target=master, args=(5,))
    ts.append(t1)
    ts.append(t2)
    t2.start()
    t1.start()
    for thread in ts:
        thread.join()
    print('End main thread, '+time.strftime('%H:%M:%S'))
master start at 16:32:43
worker start at 16:32:43
finish worker,  16:32:46
finish master,  16:32:48
End main thread, 16:32:48

main线程只有当所有子线程完成后才能执行,StackOverflow里有段很好的总结:

If, for example, you want to concurrently download a bunch of pages to concatenate them into a single large page, you may start concurrent downloads using threads, but need to wait until the last page/thread is finished before you start assembling a single page out of many. That’s when you use join().

那如果join()里带了参数呢?此时的子线程表示主线程你只要最多等我多长时间,你就可以自便了,这里参数改为join(2):

master start at 16:35:42
worker start at 16:35:42
finish worker,  16:35:45
End main thread, 16:35:46
finish master,  16:35:47

可以看到main线程等了4秒,就管自己执行后续的代码了,而main最后才完成自己的程序,这里为何是四秒?因为两个线程分别都告诉了主线程等他2秒,总共4秒,你也可以拆开,让每个线程join不同的时间
Python 多執行緒 thread join() 的作用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值