Python 多进程创建的四种方式详解

何川
何川
发布时间:2026-10-13| 9人浏览过
原创

本文详细解析 Python 中创建子进程的四种主要方式。首先介绍仅适用于 Unix/Linux 的 os.fork() 方法;其次讲解使用 multiprocessing.Process 类直接创建进程及 join() 同步机制;接着演示通过继承 Process 类自定义进程的行为;最后深入探讨使用进程池 Pool 管理大量并发任务的最佳实践,涵盖阻塞与非阻塞调用模式。

在子进程被创建时,系统会将父进程的数据空间完整复制一份给子进程,确保两者之间的数据相互独立,互不干扰。

使用 os.fork() 创建进程

使用 os.fork() 函数创建进程

需要注意的是,os.fork() 方法仅能在 Unix 或 Linux 操作系统中运行,Windows 系统不支持此功能。


import os
# 注意,fork函数,只在Unix/Linux/Mac上运行,windows不可以
pid = os.fork()
# 子进程永远返回0,而父进程返回子进程的ID。
if pid == 0:
  print('子进程')
else:
  print('父进程')

使用 Process 类创建进程

使用 Process 类创建进程

multiprocessing 模块提供了 Process 类,用于代表一个进程对象。以下示例展示了如何启动一个子进程并等待其执行完毕:


from multiprocessing import Process
import time

def test(name, age):
  for i in range(5):
    print("--test--%s\t%d" % (name, age))
    time.sleep(1)
  print("子进程结束")
if __name__ == '__main__':
  p = Process(target=test, args=("aaa", 18))
  p.start()
  # 等待进程实例执⾏结束,或等待多少秒;
  p.join() # 等待的最长时间
  print("主进程结束")
"""
输出结果:
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
子进程结束
主进程结束
"""

join() 方法的作用是使主进程阻塞,直到子进程执行完成后再继续向下执行。如果注释掉 join() 语句,主进程在启动子进程后将立即继续执行后续代码,而不会等待子进程结束,最终导致主进程先于子进程退出。

注释掉 join() 方法后的运行结果如下:


"""
输出结果:
主进程结束
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
--test--aaa 18
子进程结束
"""

通过继承 Process 子类创建进程

通过继承 Process 子类创建进程

除了直接使用 Process 类,还可以通过定义自定义类并继承 Process 类来创建新进程。每次实例化该子类时,即等同于实例化一个进程对象。具体实现见下方示例:


from multiprocessing import Process
import time
import os
class MyProcess(Process):
  def __init__(self):
    # 如果子类要重写__init__是必须要先调用父类的__init__否则会报错
    # Process.__init__(self)  
    super(MyProcess,self).__init__()
  # 重写Porcess的run()方法
  def run(self):
    print("子进程(%s)开始执行,父进程(%s)" % (os.getpid(), os.getppid()))
    for i in range(5):
      print("--1--")
      time.sleep(1)
if __name__ == '__main__':
  t_start = time.time()
  p = MyProcess()
  p.start()
  # p.join()
  print("main")
  for i in range(5):
    print("--main--")
    time.sleep(1)

使用进程池 Pool 创建进程

使用进程池 Pool 创建进程

当需要创建的子进程数量较少时,可以直接利用 multiprocessing 模块中的 Process 动态生成多个进程。然而,如果需要创建上百甚至上千个子进程,手动创建的工作量将极其巨大。此时,可以使用 multiprocessing 模块提供的 Pool(进程池)方法来高效管理。

在初始化 Pool 时,可以指定最大进程数。当有新请求提交到进程池时,如果池未满,则创建新进程执行该请求;如果池已满(达到指定的最大进程数),请求将被挂起等待,直到池中某个进程结束,系统才会创建新进程来执行该请求。具体示例如下:


from multiprocessing import Pool
import os
import time


def worker(num):
  # for i in range(3):
  print("----pid=%d num=%d---" % (os.getpid(), num))
  time.sleep(1)

if __name__ == '__main__':
  # 定义一个进程池,最大进程数3
  pool = Pool(3)
  for i in range(10):
    print("---%d--" % i)
    # 使用非阻塞方式调用func(并行执行),一般用这个。
    # apply堵塞方式必须等待上一个进程退出才能执行下一个进程,用的不多。
    pool.apply_async(worker, (i,))
  # 关闭进程池
  pool.close()
  # 等待所有子进程结束,主进程一般用来等待
  pool.join() # 进程池后面无操作时必须有这句

以上内容涵盖了 Python 中多进程创建的主要方式,希望能为读者提供有益的帮助。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

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 算法库。