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

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

本文深入解析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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。