python多进程种join()函数的作用

  1. 当使用多进程不使用join函数阻塞时的运行结果
import os
from multiprocessing import Process


"""
以下是运行结果我们可以看到 主进程并不会
等子进程运行完成后再结束,程序之间各运行
各的互不干涉
Parent process 10996
Finished
Child process 0 (984)
Child process 2 (13632)
Child process 1 (8308)
Child process 3 (8640)
Child process 4 (8412)
"""
def run_proc(name):
    print("Child process %s (%s)" % (name, os.getpid()))


if __name__ == "__main__":
    print("Parent process %s" % (os.getpid()))
    for i in range(5):
        p = Process(target=run_proc, args=(str(i),))
        p.start()
    # join 函数的作用 功能是为了实现进程同步的,
    # 而它具体 是阻塞当前进程也就是主进程直到调用join函数的进程执行完成后
    # 继续执行当前进程。
    print("Finished")

2,当只调用一个join时谁调用的主进程就等待该子进程运行结束后继续向下执行

import os
import time
from multiprocessing import Process

"""
以下是运行结果我们可以看到 主进程并不会直接结束
而是阻塞,去等待p01启动的进程结束后才继续向下执行。
Parent process 14208
Child process 1 (19392)
一共睡眠了 0 秒种
一共睡眠了 1 秒种
一共睡眠了 2 秒种
一共睡眠了 3 秒种
一共睡眠了 4 秒种
Child process 2 (17348)
Finished

"""
def run_proc(name):
    print("Child process %s (%s)" % (name, os.getpid()))

def run_proc01(name):
    for i in range(5):
        time.sleep(1)
        print("一共睡眠了 %s 秒种"%i)
    print("Child process %s (%s)" % (name, os.getpid()))


if __name__ == "__main__":
    print("Parent process %s" % (os.getpid()))
    p = Process(target=run_proc, args=(str(1),))
    p01 = Process(target=run_proc01, args=(str(2),))
    p.start()
    p01.start()
    p01.join()
    print("Finished")

3,当只调用一个join函在某个进程的start函数之前,那么因为主进程阻塞到了join这个位置会直到调用join的这个进程执行完后才开始执行下一行代码,所以start开启的时间就是阻塞后时间。


import os
from multiprocessing import Process


"""
以下是运行结果我们可以看到 在主进程中首先进入for循环
启动第一个子进程然后由于调用join函数会阻塞主进程,直到
第一个子进程执行完成后开始取消阻塞,继续执行主进程开始
开启第二个子进程然后由于第二个子进程也调用了join再阻塞主进程
一直到循环结束。 
Parent process 8028
Child process 0 (13792)
Child process 1 (11456)
Child process 2 (16948)
Child process 3 (16240)
Child process 4 (10544)
Finished
"""
def run_proc(name):
    print("Child process %s (%s)" % (name, os.getpid()))


if __name__ == "__main__":
    print("Parent process %s" % (os.getpid()))
    for i in range(5):
        p = Process(target=run_proc, args=(str(i),))
        p.start()
        p.join()
    # join 函数的作用 功能是为了实现进程同步的,
    # 而它具体 是阻塞当前进程也就是主进程直到调用join函数的进程执行完成后
    # 继续执行当前进程。
    print("Finished")

4,因此,我们从上述可以看出如果多进程写的不好的话还不如单进程因为再启动进程和阻塞进程还需要花费时间。因此join函数应该在所有的start函数之后(一般情况下)。

import os
from multiprocessing import Process


"""
这样的话不论如何运行 主进程都是在等待所有子进程完成后去继续向下执行的。
Parent process 7764
Child process 0 (12884)
Child process 2 (15644)
Child process 1 (3936)
Child process 4 (6876)
Child process 3 (16904)
Finished

"""
def run_proc(name):
    print("Child process %s (%s)" % (name, os.getpid()))


if __name__ == "__main__":
    print("Parent process %s" % (os.getpid()))
    list1 =[]
    for i in range(5):
        p = Process(target=run_proc, args=(str(i),))
        list1.append(p)
        p.start()
    for i in list1:
        i.join()
    # join 函数的作用 功能是为了实现进程同步的,
    # 而它具体 是阻塞当前进程也就是主进程直到调用join函数的进程执行完成后
    # 继续执行当前进程。
    print("Finished")

5,下面给大家分享一个有点问题的代码可以看看,大家可以留言或者私聊它的问题所在。

import os
import time
import random
from multiprocessing import Process

"""
以下是运行结果
Parent process 2432
Child process 0 (2416)
Child process 2 (8972)
Child process 1 (16916)
Child process 3 (13144)
Child process 4 (15608)
Finished
"""


def run_proc(name):
    print("Child process %s (%s)" % (name, os.getpid()))


def run_proc01(name):
    i = random.random()
    time.sleep(i)
    print("Child process %s (%s)" % (name, os.getpid()))


if __name__ == "__main__":
    print("Parent process %s" % (os.getpid()))
    for i in range(5):
        p = Process(target=run_proc, args=(str(i),))
        p.start()
    # join 函数的作用 功能是为了实现进程同步的,
    # 而它具体 是阻塞当前进程也就是主进程直到调用join函数的进程执行完成后
    # 继续执行当前进程。
    p.join()
    print("Finished")


  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值