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类型强制转换long to int的代码
Feb 10 Python
python中解析json格式文件的方法示例
May 03 Python
python数据结构之链表详解
Sep 12 Python
浅谈python中的正则表达式(re模块)
Oct 17 Python
Python pandas常用函数详解
Feb 07 Python
python3实现163邮箱SMTP发送邮件
May 22 Python
Python进阶之@property动态属性的实现
Apr 01 Python
Python使用lambda表达式对字典排序操作示例
Jul 25 Python
Python八皇后问题解答过程详解
Jul 29 Python
详解Pycharm出现out of memory的终极解决方法
Mar 03 Python
python如何变换环境
Jul 21 Python
浅谈Selenium+Webdriver 常用的元素定位方式
Jan 13 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
一次编写,随处运行
2006/10/09 PHP
DW中链接mysql数据库时,建立字符集中文出现乱码的解决方法
2010/03/27 PHP
WordPress中的shortcode短代码功能使用详解
2016/05/17 PHP
JSON字符串传到后台PHP处理问题的解决方法
2016/06/05 PHP
Thinkphp集成抖音SDK的实现方法
2020/04/28 PHP
IE6下opacity与JQuery的奇妙结合
2013/03/01 Javascript
js拖拽一些常见的思路方法整理
2014/03/19 Javascript
javascript的数组和常用函数详解
2014/05/09 Javascript
分享一个常用的javascript静态类
2014/12/31 Javascript
Java File类的常用方法总结
2015/03/18 Javascript
Jquery遍历Json数据的方法
2015/04/20 Javascript
详解JavaScript数组和字符串中去除重复值的方法
2016/03/07 Javascript
前端js实现文件的断点续传 后端PHP文件接收
2016/10/14 Javascript
基于Node.js + WebSocket打造即时聊天程序嗨聊
2016/11/29 Javascript
JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
2017/02/19 Javascript
vue.js实现数据动态响应 Vue.set的简单应用
2017/06/15 Javascript
angular实现spa单页面应用实例
2017/07/10 Javascript
使用async await 封装 axios的方法
2018/07/09 Javascript
基于vue-upload-component封装一个图片上传组件的示例
2018/10/16 Javascript
vue输入框使用模糊搜索功能的实现代码
2020/05/26 Javascript
2020淘宝618理想生活列车自动领喵币js脚本的代码
2020/06/02 Javascript
[28:48]《真视界》- 2017年国际邀请赛
2017/09/27 DOTA
深入源码解析Python中的对象与类型
2015/12/11 Python
基于Python爬取爱奇艺资源过程解析
2020/03/02 Python
文件上传服务器-jupyter 中python解压及压缩方式
2020/04/22 Python
如何用Python 加密文件
2020/09/10 Python
详解Python流程控制语句
2020/10/28 Python
Ever New美国:澳大利亚领先的女装时尚品牌
2019/11/28 全球购物
威盛公司软件C++工程师笔试题面试题
2012/07/16 面试题
销售自我评价
2013/10/22 职场文书
商务专员岗位职责
2013/11/23 职场文书
怎样写观后感
2015/06/19 职场文书
迎新生晚会主持词
2015/06/30 职场文书
为Java项目添加Redis缓存的方法
2021/05/18 Redis
面试提问mysql一张表到底能存多少数据
2022/03/13 MySQL
springboot实现string转json json里面带数组
2022/06/16 Java/Android