Python多线程与多进程中join()方法的效果是相同的。

下面仅以多线程为例:

首先需要明确几个概念:

知识点一:

当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置多线程时,主线程会创建多个子线程,在python中,默认情况下(其实就是setDaemon(False)),主线程执行完自己的任务以后,就退出了,此时子线程会继续执行自己的任务,直到自己的任务结束,例子见下面一。

知识点二:

当我们使用setDaemon(True)方法,设置子线程为守护线程时,主线程一旦执行结束,则全部线程全部被终止执行,可能出现的情况就是,子线程的任务还没有完全执行结束,就被迫停止,例子见下面二。

知识点三:

此时join的作用就凸显出来了,join所完成的工作就是线程同步,即主线程任务结束之后,进入阻塞状态,一直等待其他的子线程执行结束之后,主线程在终止,例子见下面三。

知识点四:

join有一个timeout参数:

当设置守护线程时,含义是主线程对于子线程等待timeout的时间将会杀死该子线程,最后退出程序。所以说,如果有10个子线程,全部的等待时间就是每个timeout的累加和。简单的来说,就是给每个子线程一个timeout的时间,让他去执行,时间一到,不管任务有没有完成,直接杀死。

没有设置守护线程时,主线程将会等待timeout的累加和这样的一段时间,时间一到,主线程结束,但是并没有杀死子线程,子线程依然可以继续执行,直到子线程全部结束,程序退出。

一:Python多线程的默认情况

import threading

import time

def run():

time.sleep(2)

print('当前线程的名字是: ', threading.current_thread().name)

time.sleep(2)

if __name__ == '__main__':

start_time = time.time()

print('这是主线程:', threading.current_thread().name)

thread_list = []

for i in range(5):

t = threading.Thread(target=run)

thread_list.append(t)

for t in thread_list:

t.start()

print('主线程结束!' , threading.current_thread().name)

print('一共用时:', time.time()-start_time)

其执行结果如下

关键点:

我们的计时是对主线程计时,主线程结束,计时随之结束,打印出主线程的用时。

主线程的任务完成之后,主线程随之结束,子线程继续执行自己的任务,直到全部的子线程的任务全部结束,程序结束。

二:设置守护线程

import threading

import time

def run():

time.sleep(2)

print('当前线程的名字是: ', threading.current_thread().name)

time.sleep(2)

if __name__ == '__main__':

start_time = time.time()

print('这是主线程:', threading.current_thread().name)

thread_list = []

for i in range(5):

t = threading.Thread(target=run)

thread_list.append(t)

for t in thread_list:

t.setDaemon(True)

t.start()

print('主线程结束了!' , threading.current_thread().name)

print('一共用时:', time.time()-start_time)

其执行结果如下,注意请确保setDaemon()在start()之前。

关键点:

非常明显的看到,主线程结束以后,子线程还没有来得及执行,整个程序就退出了。

三:join的作用

import threading

import time

def run():

time.sleep(2)

print('当前线程的名字是: ', threading.current_thread().name)

time.sleep(2)

if __name__ == '__main__':

start_time = time.time()

print('这是主线程:', threading.current_thread().name)

thread_list = []

for i in range(5):

t = threading.Thread(target=run)

thread_list.append(t)

for t in thread_list:

t.setDaemon(True)

t.start()

for t in thread_list:

t.join()

print('主线程结束了!' , threading.current_thread().name)

print('一共用时:', time.time()-start_time)

其执行结果如下:

关键点:

可以看到,主线程一直等待全部的子线程结束之后,主线程自身才结束,程序退出。

python如何使用多线程_Python多线程与多线程中join()的用法相关推荐

  1. python多程优化_Python 基本功: 13. 多线程运算提速

    小编在前两天开通了一个 Python 金融的专栏,顺便用 TuShare 下载了几只 A股的数据,有兴趣的小伙伴可以去看一下: 多多教Python:Python 金融: TuShare API 获取股 ...

  2. python爬虫程序下载_Python爬虫之多线程下载程序类电子书

    近段时间,笔者发现一个神奇的网站:http://www.allitebooks.com/ ,该网站提供了大量免费的编程方面的电子书,是技术爱好者们的福音.其页面如下: ![](https://imag ...

  3. python并发与并行_python多进程,多线程分别是并行还是并发

    匿名用户 1级 2017-09-30 回答 展开全部 并发和并行 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行. 你吃饭吃到一半,电话来了,你停了下来接了电话, ...

  4. python线程同步锁_Python实现的多线程同步与互斥锁功能示例

    本文实例讲述了Python实现的多线程同步与互斥锁功能.分享给大家供大家参考,具体如下: #! /usr/bin/env python #coding=utf-8 import threading i ...

  5. python如何开启多线程_Python如何创建多线程

    Python提供了_thread和threading两个模块来支持多线程,但_thread提供低级别的.原始的县城支持,以及一个简单的锁,通常情况下我们使用后者,来进行多线程编程 创建多线程 使用th ...

  6. python 线程 的类库_python类库32[多线程]

    一 python 多线程 因为CPython的实现使用了Global Interpereter Lock(GIL),使得python中同一时刻只有一个线程在执行,从而简化了python解释器的实现,且 ...

  7. python如何调用c函数实现真正意义的多线程_python如何使用多线程执行多个函数?...

    之前小编给大家介绍了用python去返回了一个值,立马就有小伙伴跟小编留言说道"能都执行多个内容?"于是,小编就给大家整理最细致,也是最简单的实现方法,方便大家理解学习,一起来看下 ...

  8. python计算密集型任务_Python多进程和多线程测试比高低,只为证明谁是最快的“仔”

    目的 前面分别详细介绍了python的多进程和多线程,如果还没看前面文章的,请先看下之前的文章详解内容.有任何疑问请留言.那这里就不再对多线程和多进程的实现和用法再赘述了.那各位同学学习了python ...

  9. python 协程 多线程_python进阶之多线程(简单介绍协程)

    多线程 线程:实现多任务的另一种方式 一个进程中,也经常需要同时做多件事,就需要同时运行多个'子任务',这些子任务,就是线程 线程又被称为轻量级进程(lightweight process),是更小的 ...

最新文章

  1. 从Webshell到肉鸡
  2. 【深度学习】图像自动处理工具SimpleITK的使用(Python)
  3. 自定义线程池内置线程池的使用 ThreadPoolExecutor和Executorservice 示例与注意事项
  4. 如何把一个运行完好的Kafka搞崩溃
  5. [会议分享]2020全球软件大会分享-PWA在项目中的最佳实践
  6. malloc/free 和 new/delete的联系和区别
  7. java写一个类吧,能不能自己写个java自带的类
  8. H5页面左图右边文字如何布局
  9. phpmyadmin mysql更新_mysql利用phpmyadmin实现数据库同步更新
  10. 45. 圆圈中最后剩下的数字
  11. x12arima季节调整方法_又到了戴贝雷帽的季节,不同发型的佩戴方法,让你秒变时髦精...
  12. android studio2.4,Android Studio 2.4 Preview 7 发布
  13. 建模方法(四)-因子分析定义和应用
  14. 一洽客服客户试用转化率100%
  15. 使用grldr文件引导windows xp、ubuntu系统
  16. c语言转义字符空格符号,C语言 转义符\t占用几个空格
  17. 考研——生命轨迹中一段无法抹去的铿锵岁月
  18. ATA并口硬盘接口图解
  19. spring data es拼音插件
  20. 【verilog】多功能数字钟的设计

热门文章

  1. 史上最详 Thymeleaf 使用教程
  2. 双向关联一对一映射详解(1)
  3. android fragment学习4-底部布局扩展TabLayout
  4. 457. 括号匹配二
  5. CVE-2017-8046(Spring Data Rest RCE)
  6. c/c++ 数组和指针
  7. #includealgorithm里的函数
  8. iPhone客户端开发笔记(一)
  9. 在网站中使用Cookie的简单例子
  10. 46 - 算法 - Leetcode 168 -26进制 --减一