Python multiprocessing中join()方法的作用与阻塞机制详解

白榆
白榆
发布时间:2026-10-14 | 6人浏览过
原创

本文深入解析Python multiprocessing模块中join()方法的核心作用。通过对比代码实践,阐明join()如何阻塞主进程以等待子进程结束,实现进程间的同步。文章展示了默认使用join、移除所有join以及仅对部分进程调用join三种场景下的执行顺序差异,帮助开发者掌握子线程/子进程启动与等待的正确时序,避免资源竞争或逻辑错误。

前言与背景

前言

在复习Python多进程语法的过程中,发现对join()方法的理解尚不够深入。本文将通过具体的代码实践,进一步剖析join()的工作机制,以加深对其功能的认识。

multiprocessing是Python提供的跨平台多进程模块,旨在充分利用多核CPU资源以提升程序运行效率。该模块支持子进程创建、进程间通信及共享数据,并提供了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.”是在func_1和func_2两个子进程均执行结束后才出现的。

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()

以上就是Python多进程中join()作用的详细内容,更多关于Python多线程join()的资料请关注本站其他相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表