Python并发编程:多进程-join方法

一 Process对象的join方法

  在主进程运行过程中,如果想并发地执行其它的任务,我们可以开启子进程,此时主进程的任务与子进程的任务分两种情况:

  • 情况一:在主进程的任务与子进程的任务彼此独立的情况下,主进程的任务先执行完毕后,主进程还需要等待子进程执行完毕,然后统一回收资源
  • 情况二:如果主进程的任务在执行到某一个阶段时,需要等待子进程执行完后才能绩效执行,就需要有一种机制能够让主进程检测子进程是否运行完毕,在子进程执行完毕后才继续执行,否则一直在原地阻塞,这就是join方法的作用

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

from multiprocessing import Process

import time

import random

import os

def task():

    print('%s is piaoing' % os.getpid())

    time.sleep(random.randrange(13))

    print('%s is piao end' % os.getpid())

if __name__ == '__main__':

    = Process(target=task)

    p.start()

    p.join()    # 等待p停止,才执行下一行代码

    print('主进程')

  有了join,程序不就是串行了吗??

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

from multiprocessing import Process

import time

import random

def task(name):

    print('%s is piaoing' % name)

    time.sleep(random.randrange(13))

    print('%s is piao end' % name)

if __name__ == '__main__':

    p1 = Process(target=task, args=('egon',))

    p2 = Process(target=task, args=('alex',))

    p3 = Process(target=task, args=('yuanhao',))

    p4 = Process(target=task, args=('wupeiqi',))

    p1.start()

    p2.start()

    p3.start()

    p4.start()

    # 会有疑问:既然join是等待进程结束,那么我像下面这样写,进程不就又变成串行的吗?

    # 当然不是了,必须明确:p.join()是让谁等?

    # 很明显p.join()是让主进程等待p的结束,卡住是主进程而绝非子进程p,

    p1.join()    # 等待p停止,才执行下一行代码

    p2.join()

    p3.join()

    p4.join()

    print('主进程')

  

详细解析如下:

  进程只要start就会在开始运行了,所以p1-p4.start()时,系统中已经有四个并发的进程了,而我们p1.join()是在等p1结束,没错p1只要不结束,主线程就会一直卡在原地,这也是问题的关键,join是让主线程等,而p1-p4仍然是并发执行的,p1.join的时候,其余p2,p3,p4仍然在运行,等p1.join结束,可能p2,p3,p4早已经结束了,这样p2.join,p3.join,p4.join直接通过检测,无需等待,所以4个join花费的总时间仍然是耗费时间最长的那个进程运行的时间

上述启动进程与join进程可以简写为

1

2

3

4

5

6

7

p_l = [p1, p2, p3, p4]

for in p_l:

    p.start()

for in p_l:

    p.join()

  

二 Process对象的其它属性和方法

进程对象的其它方法一:terminate与is_alive

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

from multiprocessing import Process

import time

import random

def task(name):

    print('%s is piaoing' % name)

    time.sleep(random.randrange(15))

    print('%s is piao end' % name)

if __name__ == '__main__':

    p1 = Process(target=task, args=('egon',))

    p1.start()

    p1.terminate()  # 关闭进程,不会立即关闭,所以is_alive立刻查看的结果可能还是存活

    print(p1.is_alive())    # 结果为True

    print('主进程')

    print(p1.is_alive())    # 结果为False

进程对象的其它属性:name和pid 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

from multiprocessing import Process

import time

import random

def task(name):

    print('%s is piaoing' % name)

    time.sleep(random.randrange(15))

    print('%s is piao end' % name)

if __name__ == '__main__':

    p1 = Process(target=task, args=('egon',), name='子进程1')      # 可以用关键参数来指定进程名

    p1.start()

    print(p1.name, p1.pid)

  

三 练习题:

1、改下下列程序,分别实现下述打印效果

1

2

3

4

5

6

7

8

9

10

11

# 效果一:保证最先输出-------->4

    p1.start()

    p2.start()

    p3.start()

    print('------->4')

    p1.join()

  

1

2

3

4

5

6

7

8

9

# 效果二:保证最后输出-------->4

    p1.start()

    p2.start()

    p3.start()

    p1.join()

    p2.join()

    p3.join()

    print('------->4')

  

1

2

3

4

5

6

7

8

9

10

# 效果三:保证按顺序输出

    p1.start()

    p1.join()

    p2.start()

    p2.join()

    p3.start()

    p3.join()

    print('------->4')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/701466.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Makefile对多个shell命令进行编排

一、背景 在日常运维过程中,我们都会需要写大量的shell命令,如果是工程相对复杂的话,shell命令往往会封装为函数,交由主函数按需调用。 本文将引入Makefile来对复杂shell命令进行封装,让其变得易读易懂。 下面以一个…

Redis 数据结构详解:底层实现与高效使用场景

String(字符串) 底层实现细节: 动态字符串(SDS): SDS相比于C语言的原生字符串,提供了自动内存管理和预分配机制。当字符串长度增加时,SDS会预先分配额外的空间,以减少内存重新分配…

PyPDF2:Python里的PDF忍者

目录📑 1. 背景📑2. PyPDF2简介:你的PDF小帮手📑3. PyPDF2全能手册📑3.1 读取PDF文件内容3.2 合并PDF文件3.3 分割PDF文件3.4 加密PDF文件 4. 总结📑 1. 背景📑 又是一个实际需求,将…

java spring 01 IOC源码

01.spring 中的基础是IOC

6-pytorch-神经网络搭建

b站小土堆pytorch教程学习笔记 1.神经网络骨架搭建:Containers 官方文档代码: import torch.nn as nn import torch.nn.functional as Fclass Model(nn.Module):def __init__(self):super().__init__()self.conv1 nn.Conv2d(1, 20, 5)self.conv2 nn.…

“TypeError: utils request jS WEBPACK IMPORTED MODULE O .default is undefined‘报错

写项目时报下列错误,找了半天,结果才发现自己在request.js中少写了一行代码 一定不要少些代码 export default requestrequest.js完整代码 import axios from axios;//创建一个新的axios对象 const request axios.create({baseURL:http://localhost:…

C++ 二分法

目录 1、704. 二分查找 2、34. 在排序数组中查找元素的第一个和最后一个位置 3、69. x的平方根 4、35. 搜索插入位置 5、852. 山脉数组的峰顶索引 6、162. 寻找峰值 7、153. 寻找旋转排序数组中的最小值 8、LCR 173. 点名 1、704. 二分查找 ​ class Solution {…

lua函数定义

1.函数定义\n定义格式如下: optional_function_scope function function_name( argument1, argument2, argument3..., argumentn) function_body return result_params_comma_separated end optional_function_scope: 该参数是可选的指定函数是全局函数还是局部函数…

C++入门2

目录 前言: 引用 引用特性: 常引用: 使用场景: 1. 做参数 2. 做返回值 3.引用做返回值(方便读写返回变量) 传值、传引用效率比较: 引用和指针的区别: 内联函数 auto关键字(C11) auto的使用细则&#xff1a…

访问raw.githubusercontent.com失败问题的处理

1 问题 GitHub上的项目的有些资源是放在raw.githubusercontent.com上的,通常我们在安装某些软件的时候会从该地址下载资源,直接访问的话经常容易失败。 # 安装operator kubectl apply -f https://raw.githubusercontent.com/oceanbase/ob-operator/2.1…

跟我学C++中级篇——单实例和静态化

一、单实例模式 在设计模式中,单实例模式几乎是所有语言中都非常常用的一种设计模式。它在实际的应用中也非常广泛,在很多的开源框架中,都可以看到单实例的影子。单实例,简单的就可以看做在整个应用周期中,只有一个对…

R3F(React Three Fiber)经验篇

之前一直在做ThreeJS方向,整理了两篇R3F(React Three Fiber)的文档,这是经验篇,如果您的业务场景需要使用R3F,可以参考一下这个文档。下面是目录,按照需求自取。 基础篇 ⬇️ R3F(…

Android 内存优化内存泄漏处理

一:匿名内部类/非静态内部类 匿名内部类的泄漏原因:匿名内部类会隐式地持有外部类的引用.当外部类被销毁时,内部类并不会自动销毁,因为内部类并不是外部类的成员变量, 它们只是在外部类的作用域内创建的对象,所以内部…

力扣细节题:翻转二叉树

细节一:递归采用前序递归 细节二:采用交换节点而不是交换数据因为左右树交换的同时左右树的所有子节点都要交换 细节三:采用外置函数因为return如果在本函数内操作会存在必须返回空指针的问题 /*** Definition for a binary tree node.* s…

01_02_mysql09_MySQL的数据目录

MySQL的数据目录 学习再总结宋红康老师课程内容1.MySQL8的主要目录结构 安装好MySQL8之后,查看如下的目录结构 find / -name mysql1.1数据库文件的存放路径 MySQL数据库文件的存放路径:/var/lib/mysql/ 1.2相关命令目录 相关命令目录:/u…

opencascade15解析导出为step格式

#include "DisplayScene.h" // 包含显示场景的头文件 #include "Viewer.h" // 包含查看器的头文件// OpenCascade 包含 #include <BRepPrimAPI_MakeCylinder.hxx> // 创建圆柱体 #include <BinXCAFDrivers.hxx> // 二进制XCAF驱动程序 #includ…

番外篇 | YOLOv5+DeepSort实现行人目标跟踪检测

前言:Hello大家好,我是小哥谈。DeepSort是一种用于目标跟踪的深度学习算法。它结合了目标检测和目标跟踪的技术,能够在视频中准确地跟踪多个目标,并为每个目标分配一个唯一的ID。DeepSort的核心思想是将目标检测和目标跟踪两个任务进行联合训练,以提高跟踪的准确性和稳定性…

创建vue3项目(基础)

首先打开自己的目录文件输入指令cmd 出现命令行工具 输入指令vue create 项目名称 按回车 选择第三个自己配置 根据需求选择 回车 选择自己需要的版本 出现这个 一直按回车大约5下或者6下 创建完毕 结束 感谢观看

Spring 中的AOP 以及与 AspectJ AOP 的区别

AOP到底是什么&#xff0c;有什么作用&#xff1a; AOP&#xff08;Aspect-Oriented Programming&#xff0c;面向切面编程&#xff09;&#xff1a; 能够将那些与业务无关&#xff0c;却为业务模块所共同调用的逻辑或责任&#xff08;例如事务处理、日志管理、权限控制等&…

【EAI 024】RoboVQA: Multimodal Long-Horizon Reasoning for Robotics

Paper Card 论文标题&#xff1a;RoboVQA: Multimodal Long-Horizon Reasoning for Robotics 论文作者&#xff1a;Pierre Sermanet, Tianli Ding, Jeffrey Zhao, et.al. 作者单位&#xff1a;Stanford University, UC Berkeley, Meta 论文原文&#xff1a;https://arxiv.org/a…