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获得linux下所有挂载点(mount points)的方法
Apr 29 Python
Python的Django框架中settings文件的部署建议
May 30 Python
python中copy()与deepcopy()的区别小结
Aug 03 Python
Python实现序列化及csv文件读取
Jan 19 Python
Python Handler处理器和自定义Opener原理详解
Mar 05 Python
python对接ihuyi实现短信验证码发送
May 10 Python
Python实现电视里的5毛特效实例代码详解
May 15 Python
Python logging模块handlers用法详解
Aug 14 Python
python操作ini类型配置文件的实例教程
Oct 30 Python
Python扫描端口的实现
Jan 25 Python
关于PySnooper 永远不要使用print进行调试的问题
Mar 04 Python
Python趣味挑战之给幼儿园弟弟生成1000道算术题
May 28 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中遇到BOM、编码导致json_decode函数无法解析问题
2014/07/02 PHP
学习php设计模式 php实现合成模式(composite)
2015/12/08 PHP
如何离线执行php任务
2017/02/21 PHP
原生JS实现Ajax通过GET方式与PHP进行交互操作示例
2018/05/12 PHP
JavaScript 字符串与数组转换函数[不用split与join]
2009/12/13 Javascript
JavaScript 数组运用实现代码
2010/04/13 Javascript
利用jquery操作select下拉列表框的代码
2010/06/04 Javascript
用JavaScript实现使用鼠标画线的示例代码
2014/08/19 Javascript
jQuery中trigger()与bind()用法分析
2015/12/18 Javascript
EasyUI 中combotree 默认不能选择父节点的实现方法
2016/11/07 Javascript
js实现Tab选项卡切换效果
2020/07/17 Javascript
React+TypeScript+webpack4多入口配置详解
2019/08/08 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
只有 20 行的 JavaScript 模板引擎实例详解
2020/05/11 Javascript
python中MySQLdb模块用法实例
2014/11/10 Python
python处理图片之PIL模块简单使用方法
2015/05/11 Python
Python sqlite3事务处理方法实例分析
2017/06/19 Python
Python实现采用进度条实时显示处理进度的方法
2017/12/19 Python
bluepy 一款python封装的BLE利器简单介绍
2019/06/25 Python
python 判断字符串中是否含有汉字或非汉字的实例
2019/07/15 Python
Python之Numpy的超实用基础详细教程
2019/10/23 Python
Python线程障碍对象Barrier原理详解
2019/12/02 Python
python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
2020/03/10 Python
python 日志模块logging的使用场景及示例
2021/01/04 Python
基于注解实现 SpringBoot 接口防刷的方法
2021/03/02 Python
利用CSS3的transform做的动态时钟效果
2011/09/21 HTML / CSS
State Cashmere官网:半零售价可持续蒙古羊绒
2020/02/26 全球购物
青年文明号创建承诺
2014/03/31 职场文书
金融系应届毕业生求职信
2014/05/26 职场文书
十佳中学生事迹材料
2014/06/02 职场文书
学习计划书怎么写
2014/09/15 职场文书
2015秋季开学典礼致辞
2015/07/16 职场文书
表扬信范文
2019/04/22 职场文书
2019运动会广播加油稿汇总
2019/08/21 职场文书
详解nginx.conf 中 root 目录设置问题
2021/04/01 Servers
Python数据分析入门之数据读取与存储
2021/05/13 Python