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应用的教程
Apr 16 Python
python中os模块详解
Oct 14 Python
pandas series序列转化为星期几的实例
Apr 11 Python
Python格式化日期时间操作示例
Jun 28 Python
使用pytorch进行图像的顺序读取方法
Jul 27 Python
解决Django layui {{}}冲突的问题
Aug 29 Python
python计算波峰波谷值的方法(极值点)
Feb 18 Python
基于python图像处理API的使用示例
Apr 03 Python
python将logging模块封装成单独模块并实现动态切换Level方式
May 12 Python
Python脚本打包成可执行文件过程解析
Oct 20 Python
Python的collections模块真的很好用
Mar 01 Python
Python中的socket网络模块介绍
Jul 23 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制作静态网站的模板框架
2006/10/09 PHP
提取HTML标签
2006/10/09 PHP
PHP系统命令函数使用分析
2013/07/05 PHP
Zend Framework教程之前端控制器Zend_Controller_Front用法详解
2016/03/07 PHP
php下载文件,添加响应头的简单实例
2016/09/22 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
2016/09/22 PHP
在Laravel中使用MongoDB的方法示例
2019/11/11 PHP
Git命令之分支详解
2021/03/02 PHP
Web开发之JavaScript
2012/03/29 Javascript
JavaScript高级程序设计(第3版)学习笔记8 js函数(中)
2012/10/11 Javascript
jquery $.trim()去除字符串空格的实现方法【附图例】
2016/03/30 Javascript
Angularjs中的事件广播 —全面解析$broadcast,$emit,$on
2016/05/17 Javascript
AngularJS 2.0入门权威指南
2016/10/08 Javascript
JavaScript实现的select点菜功能示例
2017/01/16 Javascript
JS验证不重复验证码
2017/02/10 Javascript
jQuery事件详解
2017/02/23 Javascript
Angular 4依赖注入学习教程之ValueProvider的使用(七)
2017/06/04 Javascript
JS实现图片预览的两种方式
2017/06/27 Javascript
利用npm 安装删除模块的方法
2018/05/15 Javascript
Vuex的API文档说明详解
2020/02/05 Javascript
Vue 实现监听窗口关闭事件,并在窗口关闭前发送请求
2020/09/01 Javascript
解决vue props传Array/Object类型值,子组件报错的情况
2020/11/07 Javascript
浅析JavaScript中的事件委托机制跟深浅拷贝
2021/01/20 Javascript
Python格式化压缩后的JS文件的方法
2015/03/05 Python
详解Python使用tensorflow入门指南
2018/02/09 Python
十行代码使用Python写一个USB病毒
2019/06/21 Python
python实现翻转棋游戏(othello)
2019/07/29 Python
Python3安装pip工具的详细步骤
2019/10/14 Python
python调用百度API实现人脸识别
2020/11/17 Python
尤妮佳moony海外旗舰店:日本殿堂级纸尿裤品牌
2018/02/23 全球购物
美国知名的隐形眼镜电商:Contacts America
2019/11/19 全球购物
Prototype如何实现页面局部定时刷新
2013/08/06 面试题
介绍下static、final、abstract区别
2015/01/30 面试题
幼儿园开学家长寄语(2016秋季)
2015/12/03 职场文书
Android自定义scrollview实现回弹效果
2022/04/01 Java/Android