python 多线程中join()的作用


Posted in Python onOctober 29, 2020

一 前言

温习python 多进程语法的时候,对 join的理解不是很透彻,本文通过代码实践来加深对 join()的认识。

multiprocessing 是python提供的跨平台版本的多进程模块。multiprocessing可以充分利用多核,提升程序运行效率。multiprocessing支持子进程,通信和共享数据,执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。不过今天重点了解 join。后续文章会逐步学习介绍其他组件或者功能。

二 动手实践

join()方法可以在当前位置阻塞主进程,带执行join()的进程结束后再继续执行主进程的代码逻辑。

# encoding: utf-8
"""
author: yangyi@youzan.com
time: 2019/7/30 11:20 AM
func:
"""

from multiprocessing import Process
import os
import time

def now():
  return str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))


def func_1(name):
  print(now() + ' Run child process %s (%s)...' % (name, os.getpid()))
  time.sleep(4)
  print(now() + ' Stop child process %s (%s)...\n' % (name, os.getpid()))


def func_2(name):
  print(now() + ' Run child process %s (%s)...' % (name, os.getpid()))
  time.sleep(8)
  print(now() + ' hello world!')
  print(now() + ' Stop child process %s (%s)...\n' % (name, os.getpid()))


if __name__ == '__main__':
  print ('Parent process %s.' % os.getpid())
  p1 = Process(target=func_1, args=('func_1',))
  p2 = Process(target=func_2, args=('func_2',))
  print now() + ' Process start.'
  p1.start()
  p2.start()
  p1.join()
  p2.join()
  print now() + ' Process end .'

输出结果

python 多线程中join()的作用

结果显示

主进程的 Process end .是在func1 和func2 结束之后才打印出来的。

2.2 去掉 join() 函数

if __name__ == '__main__':
  print ('Parent process %s.' % os.getpid())
  p1 = Process(target=func_1, args=('func_1',))
  p2 = Process(target=func_2, args=('func_2',))
  print now() + ' Process start.'
  p1.start()
  p2.start()
  print now() + ' Process end .'

结果如下:

python 多线程中join()的作用

2.3 去掉func_2 的 join()

if __name__ == '__main__':
  print ('Parent process %s.' % os.getpid())
  p1 = Process(target=func_1, args=('func_1',))
  p2 = Process(target=func_2, args=('func_2',))
  print now() + ' Process start.'
  p1.start()
  p2.start()
  p1.join() ### 在p1 执行完之后 。不等待p2 执行,主进程结束。
  print now() + ' Process end .'

结果如下:

python 多线程中join()的作用

结果显示主线程 "Process end"在func_1 执行结束之后输出而没有等待func_2 执行完毕。

2.4 小结

利用多线程时,一般都先让子线程调用start() ,然后再去调用join(),让主进程等待子进程结束才继续走后续的逻辑。

思考题

能不能每个子进程调用start() 之后,然后直接调用join() 类似:

p1.start()p1.join()p2.start()p2.join()

以上就是python 多线程中join()的作用的详细内容,更多关于python 多线程join()的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python的垃圾回收机制深入分析
Jul 16 Python
Python中实现从目录中过滤出指定文件类型的文件
Feb 02 Python
python简单实现计算过期时间的方法
Jun 09 Python
利用python打印出菱形、三角形以及矩形的方法实例
Aug 08 Python
Python创建普通菜单示例【基于win32ui模块】
May 09 Python
实践Vim配置python开发环境
Jul 02 Python
Django中的forms组件实例详解
Nov 08 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
Mar 01 Python
Python进程间通信Queue消息队列用法分析
May 22 Python
Python自定义聚合函数merge与transform区别详解
May 26 Python
解决keras backend 越跑越慢问题
Jun 18 Python
Ubuntu20.04环境安装tensorflow2的方法步骤
Jan 29 Python
pycharm2020.1.2永久破解激活教程,实测有效
Oct 29 #Python
python 实现音频叠加的示例
Oct 29 #Python
详解python的super()的作用和原理
Oct 29 #Python
Python生成pdf目录书签的实例方法
Oct 29 #Python
利用python清除移动硬盘中的临时文件
Oct 28 #Python
python实现一个简单RPC框架的示例
Oct 28 #Python
pycharm永久激活超详细教程
Oct 29 #Python
You might like
PHP 图像尺寸调整代码
2010/05/26 PHP
php判断变量类型常用方法
2012/04/24 PHP
yii2实现根据时间搜索的方法
2016/05/25 PHP
php 数组字符串搜索array_search技巧
2016/07/05 PHP
ThinkPHP下表单令牌错误与解决方法分析
2017/05/20 PHP
js prototype截取字符串函数
2010/04/01 Javascript
js获得指定控件输入光标的坐标兼容IE,Chrome,火狐等多种主流浏览器
2013/05/21 Javascript
javascript ajax的5种状态介绍
2014/08/18 Javascript
基于jquery实现页面滚动到底自动加载数据的功能
2015/12/19 Javascript
BooStrap对导航条的改造实践小结
2016/09/21 Javascript
B/S(Web)实时通讯解决方案分享
2017/04/06 Javascript
微信小程序中显示html格式内容的方法
2017/04/25 Javascript
JavaScript变量类型以及变量作用域详解
2017/08/14 Javascript
angularjs实现时间轴效果的示例代码
2017/11/29 Javascript
jQuery EasyUI 选项卡面板tabs的使用实例讲解
2017/12/25 jQuery
基于node简单实现RSA加解密的方法步骤
2019/03/21 Javascript
在layui中select更改后生效的方法
2019/09/05 Javascript
JS实现联想、自动补齐国家或地区名称的功能
2020/07/07 Javascript
vue自定义组件(通过Vue.use()来使用)即install的用法说明
2020/08/11 Javascript
[30:37]【全国守擂赛】第三周擂主赛 Dark Knight vs. Leopard Gaming
2020/05/04 DOTA
python中日志logging模块的性能及多进程详解
2017/07/18 Python
详解Python 协程的详细用法使用和例子
2018/06/15 Python
PyQt4编程之让状态栏显示信息的方法
2019/06/18 Python
python 求定积分和不定积分示例
2019/11/20 Python
Python图像阈值化处理及算法比对实例解析
2020/06/19 Python
Python 分布式缓存之Reids数据类型操作详解
2020/06/24 Python
Python如何使用ElementTree解析xml
2020/10/12 Python
HTML5 canvas实现雪花飘落特效
2016/03/08 HTML / CSS
HTML5不支持标签和新增标签详解
2016/06/27 HTML / CSS
资深财务管理人员自我评价
2013/09/22 职场文书
函授毕业生自我鉴定
2013/11/06 职场文书
六一儿童节活动策划方案
2014/01/27 职场文书
安全协议书范本
2014/04/21 职场文书
2014年扶贫帮困工作总结
2014/12/09 职场文书
总经理助理岗位职责
2015/01/31 职场文书
刑事申诉状范文
2015/05/20 职场文书