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实现二分查找与bisect模块详解
Jan 13 Python
python创建文件备份的脚本
Sep 11 Python
python ddt数据驱动最简实例代码
Feb 22 Python
Python3实现的简单工资管理系统示例
Mar 12 Python
python中比较两个列表的实例方法
Jul 04 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
Dec 10 Python
python代码中怎么换行
Jun 17 Python
Python制作一个仿QQ办公版的图形登录界面
Sep 22 Python
Python利用Pillow(PIL)库实现验证码图片的全过程
Oct 04 Python
python3实现名片管理系统(控制台版)
Nov 29 Python
Python Pandas知识点之缺失值处理详解
May 11 Python
Python打包exe时各种异常处理方案总结
May 18 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
咖啡豆的最常见发酵处理方法,详细了解一下
2021/03/03 冲泡冲煮
php批量删除cookie的简单实现方法
2015/01/26 PHP
php使用curl模拟多线程实现批处理功能示例
2019/07/25 PHP
不同的jQuery API来处理不同的浏览器事件
2012/12/09 Javascript
在表单提交前进行验证的几种方式整理
2013/07/31 Javascript
多个jquery.datatable共存,checkbox全选异常的快速解决方法
2013/12/10 Javascript
js setTimeout()函数介绍及应用以倒计时为例
2013/12/12 Javascript
IE浏览器下PNG相关功能
2015/07/05 Javascript
jquery实现移动端点击图片查看大图特效
2020/09/11 Javascript
深入理解bootstrap框架之入门准备
2016/10/09 Javascript
全屏滚动插件fullPage.js使用实例解析
2016/10/21 Javascript
Vue组件开发初探
2017/02/14 Javascript
JavaScript基于面向对象实现的猜拳游戏
2018/01/03 Javascript
支付宝小程序tabbar底部导航
2018/11/06 Javascript
JavaScript数据结构之栈实例用法
2019/01/18 Javascript
基于JavaScript实现贪吃蛇游戏
2020/03/16 Javascript
vuex分模块后,实现获取state的值
2020/07/26 Javascript
[50:50]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第一场 12.10
2020/12/13 DOTA
Python实现批量把SVG格式转成png、pdf格式的代码分享
2014/08/21 Python
用C++封装MySQL的API的教程
2015/05/06 Python
python基于右递归解决八皇后问题的方法
2015/05/25 Python
python类:class创建、数据方法属性及访问控制详解
2016/07/25 Python
python实现神经网络感知器算法
2017/12/20 Python
详解从Django Allauth中进行登录改造小结
2019/12/18 Python
django restframework serializer 增加自定义字段操作
2020/07/15 Python
加拿大奢华时装品牌:Mackage
2018/01/10 全球购物
澳大利亚首屈一指的鞋类品牌:Tony Bianco
2018/03/13 全球购物
捷克多品牌在线时尚商店:ANSWEAR.cz
2020/10/03 全球购物
外包公司软件测试工程师
2014/11/01 面试题
大学生未来职业生涯规划书
2014/02/15 职场文书
自主招生推荐信范文
2014/05/10 职场文书
公司活动总结怎么写
2014/06/25 职场文书
影视广告专业求职信
2014/09/02 职场文书
2019森林防火宣传标语大全!
2019/07/03 职场文书
委托开发合同书(标准版)
2019/08/07 职场文书
云服务器部署 Web 项目的实现步骤
2022/06/28 Servers