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


猜你喜欢
- 阅读上一篇:垂直栅格与渐进式行距(上) 新问题来也匆匆,去也“冲冲”。距上次发布垂直栅格与渐进式行距(上)发布,已经不知不觉过去了
- SecureFile功能是oracle 11g中对大对象(LOB)存储格式的完全重新设计实现,原来的LOB存储格式现在通称为BASIXFIL
- 1.不转意html entities 一个基本的常识:所有不可信任的输入(特别是用户从form中提交的数据) ,输出之前都要转意。 echo
- python-opencv获取二值图像轮廓及中心点坐标代码:groundtruth = cv2.imread(groundtruth_pat
- 数据的安全性策略: 数据的生考虑应基于数据的重要性。如果数据不是很重要,那么数据的安全性策略可以稍稍放松一些。然而,如果数据很重要,那么应该
- 本文实例总结了python调用函数、类和文件操作。分享给大家供大家参考,具体如下:调用函数有三种方式一,导入整个模块(所有函数)导入 imp
- 在Oracle数据库中,DBA可以通过观测一定的表或视图来了解当前空间的使用状况,进而作出可能的调整决定。 一.表空间的自由空间 通过对表空
- vuex的理论知识就不多提了,官网上已经有明确的讲解。用一个简单的例子来描述一下基本的用法:第一步:npm install vuex –sa
- python正则模块re中findall和finditer两者相似,但却有很大区别。 两者都可以获取所有的匹配结果,这和searc
- 前端通过Ajax来获取服务器资源时,会存在跨域问题。因为Ajax只能同源使用(预防某些恶意行为),所以当访问不在同一个域中的资源时,就会出现
- 定义变量什么是变量?在程序运行过程中,其值可以改变的量变量的定义?在 python 中,每个变量在使用前都必须赋值,变量赋值以后该变量才会被
- 今天把博客的日历脚本又改了一改,就帖上了,以后找起来方便一点,同时也给需要的人带来方便,本来还想加点功能再帖上来,不过我看还是没必要了,帖的
- 1.索引碎片的产生?由于在表里大量的插入、修改、删除操作而使索引页分裂。如果索引有了高的碎片,有两种情况,一种情况是扫描索引需要花费很多的时
- 利用js实现点击一张图片,直接上传到指定的action,方法简单,一看就会了,只需要用户点击图片一次就可以实现图片上传功能。主要用到了onc
- 本文实例为大家分享了python实现五子棋游戏的具体代码,供大家参考,具体内容如下话不多说,直接上代码:全部工程文件,在GitHub:五子棋
- Stochastic Depth论文:Deep Networks with Stochastic Depth本文的正则化针对于ResNet中
- 在项目中发现这样一个问题:sqlserver数据库编码为gbk,使用python3.4+pymssql 查询,中文乱码,经过一番思考问题解决
- asp中使用addnew方法添加一条记录后,我们经常使用取得自递增的ID,而使用bookmark很容易实现这样的功能。rs.open&nbs
- 本文实例讲述了Python实现获取前100组勾股数的方法。分享给大家供大家参考,具体如下:本来想采用穷举试探的方式来做这个算法,后来发现还是
- 一、获取安装包最近的版本为0.4.12,下载地址:http://sourceforge.net/projects/sysbench/二、编译