Python进程状态与multiprocessing模块使用详解

周末不加班
周末不加班
发布时间:2026-10-13| 4人浏览过
原创

本文详细解析Python中进程的概念与三种运行状态,重点介绍如何使用multiprocessing模块的Process类创建子进程。内容涵盖进程PID获取、构造函数参数说明、常用方法如start和join,以及子进程间全局变量不共享的特性,附带完整代码示例。

本文通过具体实例深入解析Python中进程的状态机制、创建方式及实际使用方法,旨在为读者提供清晰的参考指南。

进程概念与运行状态

进程及其运行状态

1. 进程概念解析

程序是指静态的代码文件,例如xxx.py,它本身不执行任何操作。

进程则是程序运行时的实体,由代码和所占用的系统资源共同组成,它是操作系统进行资源分配的基本单元。

除了线程可以实现多任务处理外,进程同样具备执行多任务的能力。

2. 进程的三种状态

在实际工作中,待处理的任务数量通常超过CPU的核心数量。这意味着部分任务正在执行,而其余任务处于等待状态,从而形成了不同的进程状态。

  • 就绪态:进程已具备所有运行条件,正在等待CPU调度以执行。
  • 执行态:CPU正在运行该进程的功能代码。
  • 等待态:进程因等待某些条件满足(如执行sleep操作)而暂时挂起。

使用multiprocessing创建进程

进程的创建:使用multiprocessing模块

multiprocessing模块提供了跨平台的多进程支持,通过Process类来代表一个进程对象。该对象可视为一个独立的执行单元,用于执行特定的任务。

示例:两个while循环并发执行


# -*- coding:utf-8 -*-
from multiprocessing import Process
import time
def run_proc():
  """子进程要执行的代码"""
  while True:
    print("----2----")
    time.sleep(1)
if __name__=='__main__':
  p = Process(target=run_proc)
  p.start()
  while True:
    print("----1----")
    time.sleep(1)

说明

  • 创建子进程时,需传入执行函数及其参数,实例化Process对象后调用start()方法即可启动进程。

示例:获取进程PID


# -*- coding:utf-8 -*-
from multiprocessing import Process
import os
import time
def run_proc():
  """子进程要执行的代码"""
  print('子进程运行中,pid=%d...' % os.getpid()) # os.getpid获取当前进程的进程号
  print('子进程将要结束...')
if __name__ == '__main__':
  print('父进程pid: %d' % os.getpid()) # os.getpid获取当前进程的进程号
  p = Process(target=run_proc)
  p.start()

Process类的语法结构如下:

Process([group [, target [, name [, args [, kwargs]]]]])

  • target:指定子进程要执行的函数引用。
  • args:以元组形式向target指定的函数传递位置参数。
  • kwargs:以字典形式向target指定的函数传递关键字参数。
  • name:为进程设定别名,若不设定则使用默认值。
  • group:指定进程组,大多数场景下无需使用。

Process实例的常用方法:

  • start():启动子进程,即创建并运行子进程。
  • is_alive():检查子进程是否仍在运行。
  • join([timeout]):主进程等待子进程执行完毕,或等待指定的秒数。
  • terminate():无论任务是否完成,立即终止子进程。

Process实例的常用属性:

  • name:进程别名,默认为Process-N,N为从1开始递增的整数。
  • pid:当前进程的进程号(Process ID)。

子进程参数传递与变量隔离

示例:向子进程函数传递参数


# -*- coding:utf-8 -*-
from multiprocessing import Process
import os
from time import sleep
def run_proc(name, age, **kwargs):
  for i in range(10):
    print('子进程运行中,name= %s,age=%d ,pid=%d...' % (name, age, os.getpid()))
    print(kwargs)
    sleep(0.2)
if __name__=='__main__':
  p = Process(target=run_proc, args=('test',18), kwargs={"m":20})
  p.start()
  sleep(1) # 1秒中之后,立即结束子进程
  p.terminate()
  p.join()

运行结果如下:

子进程运行中,name= test,age=18 ,pid=45097... {'m': 20} 子进程运行中,name= test,age=18 ,pid=45097... {'m': 20} 子进程运行中,name= test,age=18 ,pid=45097... {'m': 20} 子进程运行中,name= test,age=18 ,pid=45097... {'m': 20} 子进程运行中,name= test,age=18 ,pid=45097... {'m': 20}

示例:进程间不共享全局变量


# -*- coding:utf-8 -*-
from multiprocessing import Process
import os
import time
nums = [11, 22]
def work1():
  """子进程要执行的代码"""
  print("in process1 pid=%d ,nums=%s" % (os.getpid(), nums))
  for i in range(3):
    nums.append(i)
    time.sleep(1)
    print("in process1 pid=%d ,nums=%s" % (os.getpid(), nums))
def work2():
  """子进程要执行的代码"""
  print("in process2 pid=%d ,nums=%s" % (os.getpid(), nums))
if __name__ == '__main__':
  p1 = Process(target=work1)
  p1.start()
  p1.join()
  p2 = Process(target=work2)
  p2.start()

运行结果如下:

in process1 pid=11349 ,nums=[11, 22] in process1 pid=11349 ,nums=[11, 22, 0] in process1 pid=11349 ,nums=[11, 22, 0, 1] in process1 pid=11349 ,nums=[11, 22, 0, 1, 2] in process2 pid=11350 ,nums=[11, 22]

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python进程与线程操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》、《Python+MySQL数据库程序设计入门教程》及《Python常见数据库操作技巧汇总》

希望本文所述内容能对读者的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 算法库。