python 多线程中join()的作用
作者:用户1278550 发布时间:2022-11-27 12:24:24
标签:python,多线程,join()
一 前言
温习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 .'
输出结果
结果显示
主进程的 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 .'
结果如下:
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 .'
结果如下:
结果显示主线程 "Process end"在func_1 执行结束之后输出而没有等待func_2 执行完毕。
2.4 小结
利用多线程时,一般都先让子线程调用start() ,然后再去调用join(),让主进程等待子进程结束才继续走后续的逻辑。
思考题
能不能每个子进程调用start() 之后,然后直接调用join() 类似:
p1.start()p1.join()p2.start()p2.join()
来源:https://cloud.tencent.com/developer/article/1478401
0
投稿
猜你喜欢
- 需求背景假设我们想设计一个定时任务,比如每天定时的用python来测试服务是否在正常运行,但是又不希望每天登录到系统后台去查看服务状态。这里
- Urllib1. Urllib.request.urlopen().read().decode()返回一个二进制的对象,对这个对象进行rea
- Real Numbers实数实数是具有小数部分的数字, 当然, 实数不是专门用来表示小数的, 也可以用DECIMAL来存储那些无法用INTE
- <input name="a" type="checkbox"
- 系列最后一篇来说说Python中的类与对象,Python这门语言是无处不对象,如果你曾浅要了解过Python,你应该听过Python是一种面
- BrowserPlus 到底是什么,又能做什么?BrowserPlus 是 Yahoo! 最近刚发布一个 Web 扩展的平台:终端用户需安装
- 读《论语》,子张十九,子夏曰:博学而笃志,切问而近思,仁在其中矣。 博学:架构需要广度,要尽量多学习各方面的知识。笃志:除了广度,架构师还需
- 论坛有人问起如何获取读取CSS属性值,就写了下面这段兼容各浏览器的获取HTML元素的css属性值函数:function getSt
- 用yum更新PHP,只需用一条命令就可以搞定: #yum update php 但问题来了,使用此命令后,系统告诉我,没有发现可更新的包。而
- 学习了css一段时间,现在对css的一些技巧进行一次小结.希望能对那些刚学习css的新手们带来帮助.一、关于注释在创建xhtml+CSS网站
- parse_dates : boolean or list of ints or names or list of lists or dic
- 如何提高Request集合的使用效率?以加快程序处理速度: strTitle=Request.Form("Title&q
- 搭建FTP,或者是搭建网络文件系统,这些方法都能够实现Linux的目录共享。但是FTP和网络文件系统的功能都过于强大,因此它们都有一些不够方
- 一 前期说明:我运行项目的环境是nginx+php,存储代码用的是gitlab,python版本:3.6 django版本:2.2.1 my
- 前言:书终于完稿了,我也有了一些自己的时间,于是决定将书中讲到的一些比较常见的知识点整理出来,发在Blog里面。当然也不会完全发表出来,毕竟
- 内容摘要:本文介绍了asp使用正则表达式自动解析远程图片地址并下载保存的方法,值得收藏!一、使用正则表达式Regexp匹配取得原页中的图片的
- 窗外下着小雨,作为单身程序员的我逛着逛着发现一篇好东西,来自知乎 你都用 Python 来做什么?的第一个高亮答案。到上面去看了看,地址都是
- bottle是一个小型web框架,很小只有一个文件,但功能确很强大,学起来也简单,简单和小巧的同时也有很多不足,某些功能支持还不是很完善,比
- 实例如下所示:from xml.etree.cElementTree import ElementTree,Elementimport xl
- 这是官方对SubFolders的介绍:返回由指定文件夹中所有子文件夹(包括隐藏文件夹和系统文件夹)组成的 Folders 集合。object