首页 > 其他分享 >10月26日Process的join用法

10月26日Process的join用法

时间:2023-10-26 15:37:18浏览次数:41  
标签:__ 10 26 join Process args time 进程

目录

Process的join用法

为什么会有这个方法呢?

是这样的如果我有一个需求就是子进程运行完了在运行主进程,那么这个该如何实现?

第一种方式就是用time模块

# 这里有一个需求就是子进程运行完在运行主进程,这个该如何实现?
#方式一:用time模块,虽然可以,但是每个电脑的反应时间是不一样的,这个方法太low了
from multiprocessing import Process

import time

def foo():
    print('进程 start')
    time.sleep(2)
    print('进程 end')


if __name__ == '__main__':
    p = Process(target=foo)
    p.start()
    time.sleep(2)
    print('主进程')

这个方式确实可以实现但是每个电脑的反应时间是不一样的,如果用time就要算反应时间很麻烦而且太low了

第二种方式就是join方法了

join方法就类似停止,但是它会把主进程进行阻塞,直到调用join方法的子进程执行完毕,然后主进程才能执行。

(同时需要注意一点,视频里有一处地方让人以为这个方法具有停止的功能,但是没有这个功能切记切记)

join代码如下

import time
from multiprocessing import Process


def foo(x, y):
    print(f'进程开始{x}')
    time.sleep(y)
    print(f'进程{x}结束')


if __name__ == '__main__':
    p1 = Process(target=foo, args=(1, 2))  # 这里面的args就是*args的一种体现,这个args里面我传的第一个参数1是给子进程用来命名,第二个参数给time.sleep传参数来确定睡眠时间
    p2 = Process(target=foo, args=(2, 2))  # 这里的args和上面的情况一样
    p3 = Process(target=foo, args=(3, 2))  # 这里的args和上面的情况一样
    p4 = Process(target=foo, args=(4, 2))  # 这里的args和上面的情况一样

    start = time.time()  # 这里来添加一个读取开始时间的代码

    p1.start()  # 这里告诉操作系统开启子进程
    p1.join()  # p1这个子进程调用join这个方法让主进程阻塞

    p2.start()  # 和p1的情况一样
    p2.join()  # 和p1的情况一样

    p3.start()
    p3.join()

    p4.start()
    p4.join()

    # 阻塞住主进程,等待该子进程结束,然后在执行主进程,看似是join方法实际内部会调用wait()

    # 这里添加一个读取结束时间的代码

    end = time.time()  # 这里添加一个读取结束时间的代码

    print(end - start)  # 这里输出总时长的值

    print('主进程')

这个代码p1 = Process(target=foo, args=(1, 2))里的args就是*args的一种体现,这个args里面我传的第一个参数1是给子进程用来命名,第二个参数给time.sleep传参数来确定睡眠时间

结果如图

结果就体现了join()方法的用法了。

这里提一个情况,上面我用的是join方法但实际上我使用了wait方法。

wait()方法是用于等待子进程结束的低级方法。当调用join()时,它实际上在内部调用wait()来等待子进程的结束。

然后这个方法被封装在join内,同时这个方法比较依赖操作系统

给上面的代码略微升级添加for循环来使用来减少冗余

import time
from multiprocessing import Process


def foo(x, y):
    print(f'进程开始{x}')
    time.sleep(y)
    print(f'进程{x}结束')


if __name__ == '__main__':
    start = time.time()
    p_list = []

    for i in range(1,4):#这里省去给函数传参时代码冗余的情况
        p = Process(target=foo, args=(i, 1))
        p.start()
        p_list.append(p)#将生成的子进程添加到这个p_list的列表里面

    print(p_list)

    for p in p_list:#这里让列表里面的子进程来分别调用join()方法
        p.join()
    end = time.time()
    print(end - start)
    print('主进程')

这个代码就解决了,向操作系统申请开启子进程以及每个子进程调用join()方法冗余的情况

结果如下

这种方式就更利于代码的简便

标签:__,10,26,join,Process,args,time,进程
From: https://www.cnblogs.com/slzjb/p/17789500.html

相关文章

  • 刷题记录 2023-10-26
    最近需要刷一点博弈论的题目LG-1288\(\Rightarrow\)题目链接可以想到,如果可操作序列的长度是奇数,那么先手必胜,如果是偶数,那么先手必败。LG-1290\(\Rightarrow\)题目链接设\(f(i,j)\)表示当前较大的石子堆和较小的石子堆的大小分别为\(i,j\),先手者是否存在必胜策略。可......
  • (2023.10.26)kdump
    https://dandelioncloud.cn/article/details/1564778026242371586https://www.cnblogs.com/ccccxy/articles/14382858.htmlhttps://blog.csdn.net/u012294613/article/details/122025017https://blog.csdn.net/gjioui123/article/details/128083045https://community.nxp.......
  • 2023-2024-1 20211108_20211120_20211103_20211125 实验一:开发环境的熟悉 小组实验过
    实验课小组成员20211108俞振阳、20211120刘钟徽、20211103白皓宇、20211125苗靖章实验一-1-交叉编译环境-(使用自己笔记本电脑)实验题目要求实验三人一组可以使用自己的笔记本,也可以使用实验室台式机,使用实验室机器的不用做本题安装老师提供的software目录中的VMware-works......
  • 10月《中国数据库行业分析报告》已发布,深度剖析甲骨文大会Oracle技术新趋势
    为了帮助大家及时了解中国数据库行业发展现状、梳理当前数据库市场环境和产品生态等情况,从2022年4月起,墨天轮社区行业分析研究团队出品将持续每月为大家推出最新《中国数据库行业分析报告》,持续传播数据技术知识、努力促进技术创新与行业生态发展,目前已更至第十七期,并发布了共计1......
  • 反序列化加命令执行2023/10/25
    #[SWPUCTF2022新生赛]1z_unserialize<?phpclasslyh{public$url='NSSCTF.com';public$lt;public$lly;function__destruct(){$a=$this->lt;$a($this->lly);}}unserialize($_POST['nss'......
  • 10_组合逻辑电路
    组合逻辑电路特点根据题目设计逻辑电路......
  • Kubernetes 100个常用命令
    转载https://mp.weixin.qq.com/s/pWj-ni5fuHLaK2AR-4gqqQ100个Kubectl命令,这些命令对于诊断Kubernetes集群中的问题非常有用。这些问题包括但不限于:• 集群信息• Pod诊断• 服务诊断• 部署诊断• 网络诊断• 持久卷和持久卷声明诊断• 资源......
  • PAT_B1003 我要通过!
    “答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送——只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。得到“答案正确”的条件是:字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;任意形如 xPA......
  • 10月26日开启进程以及扩展点
    目录开启进程开启方式一开启方式二验证主进程和子进程直接是否具有内存隔离僵尸进程以及孤儿进程(了解)孤儿进程开启进程开启子进程的时候:把父进程的代码完整复制到一个新的内存空间里去执行,达到多个并行的作用开启方式一首先调用multiprocessing里面的Processfrommultipr......
  • 2023-10-14:用go语言,给定 pushed 和 popped 两个序列,每个序列中的 值都不重复, 只有当它
    2023-10-14:用go语言,给定pushed和popped两个序列,每个序列中的值都不重复,只有当它们可能是在最初空栈上进行的推入push和弹出pop操作序列的结果时,返回true;否则,返回false。输入:pushed=[1,2,3,4,5],popped=[4,5,3,2,1]。输出:true。来自美团。答案2023-10-14:大体过程如......