Python使用multiprocessing实现多进程

 更新时间:2025年07月21日 09:35:04   作者:黑鹿022  
当我们工作中涉及到处理大量数据、并行计算或并发任务时,Python的multiprocessing模块是一个强大而实用的工具,在本文中,我们将探索如何使用multiprocessing模块实现多进程编程,将介绍进程池的概念和用法,需要的朋友可以参考下

一、进程概念

进程(Process)是资源分配的最小单位,它是操作系统进行资源分配和调度运行的基本单位,通俗理解:一个正在运行的程序就是一个进程。

注: 一个程序运行后至少有一个进程

二、python多进程

在python中使用多进程我们需要导入 multiprocessing 模块

import multiprocessing

实例演示:

  • 我们先定义两个函数,然后创建子进程去调用它们
import time

def mission1(n):
    for i in range(1, n + 1):
        print(f'第{i}次执行任务一。')
        time.sleep(0.2)


def mission2(n):
    for i in range(1, n + 1):
        print(f"第{i}次执行任务二。")
        time.sleep(0.2)

每个函数每次循环都sleep 0.2秒目的是为了之后演示进程之间是同步执行的情况,否则程序运行太快没办法体现。

我们先试着直接调用它们:

mission1(5)
mission2(5)
"""
结果:
第1次执行任务一。
第2次执行任务一。
第3次执行任务一。
第4次执行任务一。
第5次执行任务一。
第1次执行任务二。
第2次执行任务二。
第3次执行任务二。
第4次执行任务二。
第5次执行任务二。
"""

结果:先执行了mission1 再执行了mission2

  • 子进程依赖于父进程创建,因而我们要创建两个子进程,那么必须在父进程里面去创建。
    python运行文件的时候会创建一个主进程也就是 MainProcess,因而我们必须在main里面去操作子进程:
if __name__ == '__main__':
		pass
  • 接着我们创建子进程对象:
if __name__ == '__main__':
    p1 = multiprocessing.Process(target=mission1,  args=(5,))
    p2 = multiprocessing.Process(target=mission2,  kwargs={'n': 5})

multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={}) :
target—表示调用对象,即子进程要执行的任务(回调函数入口地址)
args—表示以元组的形式向子任务函数传参,元组方式传参一定要和参数的顺序保持一致
kwargs—表示以字典的方式给子任务函数传参,字典方式传参字典中的key要和参数名保持一致
name—为子进程的名称

进程运行:

p1.start()
p2.start()
  • 完整代码:
import multiprocessing

import time

def mission1(n):
    for i in range(1, n + 1):
        print(f'第{i}次执行任务一。')
        time.sleep(0.2)


def mission2(n):
    for i in range(1, n + 1):
        print(f"第{i}次执行任务二。")
        time.sleep(0.2)


if __name__ == '__main__':
    p1 = multiprocessing.Process(target=mission1,  args=(5,)) # 注意单元素的元组格式
    p2 = multiprocessing.Process(target=mission2,  kwargs={'n': 5})

    p1.start()
    p2.start()
 
"""
结果:
第1次执行任务一。
第1次执行任务二。
第2次执行任务一。
第2次执行任务二。
第3次执行任务一。
第3次执行任务二。
第4次执行任务一。
第4次执行任务二。
第5次执行任务一。
第5次执行任务二。
"""

结果显示:两个函数在两个子进程中同时执行。(每次执行顺序可能有略微差别)

获取进程信息

current_process()

获取当前进程的信息:name(进程名称) 和 pid (进程ID)

def mission1(user, n):
    print(f"mission-1子进程:{multiprocessing.current_process().name}")
    print(f"mission-1子进程ID:{multiprocessing.current_process().pid}")
    for i in range(1, n + 1):
        print(f"用户{user}正在第{i}次执行任务一。")
        time.sleep(0.2)

OS 模块

可以使用os模块中的getpid()获取当前进程的ID 以及 getppid()获取当前进程的父进程ID。

import os
def mission2(user, n):
    print(f"mission-2子进程:{multiprocessing.current_process().name}")
    print(f"mission-2子进程ID:{os.getpid()}")
    print(f"mission-2子进程的父进程为:{os.getppid()}")
    for i in range(1, n + 1):
        print(f"用户{user}正在第{i}次执行任务二。")
        time.sleep(0.2)

完整代码:

import multiprocessing
import time
import os


def mission1(user, n):
    print(f"mission-1子进程:{multiprocessing.current_process().name}")
    print(f"mission-1子进程ID:{multiprocessing.current_process().pid}")
    print(f"mission-1子进程的父进程为:{os.getppid()}")
    for i in range(1, n + 1):
        print(f"用户{user}正在第{i}次执行任务一。")
        time.sleep(0.2)


def mission2(user, n):
    print(f"mission-2子进程:{multiprocessing.current_process().name}")
    print(f"mission-2子进程ID:{os.getpid()}")
    print(f"mission-2子进程的父进程为:{os.getppid()}")
    for i in range(1, n + 1):
        print(f"用户{user}正在第{i}次执行任务二。")
        time.sleep(0.2)

if __name__ == '__main__':
    print(f"主进程的ID为:{multiprocessing.current_process().pid}")
    print(f"主进程的父进程ID为:{os.getppid()}")
    print(f'--------主进程{multiprocessing.current_process().name}开始执行--------')

    p1=multiprocessing.Process(target=mission1,name='mission-1',args=('张三',5))
    p2=multiprocessing.Process(target=mission2,name='mission-2',args=('李四',5))

    p1.start()
    p2.start()
"""
主进程的ID为:7500
主进程的父进程ID为:39284
--------主进程MainProcess开始执行--------
mission-2子进程:mission-2
mission-2子进程ID:40552
mission-2子进程的父进程为:7500
用户李四正在第1次执行任务二。
mission-1子进程:mission-1
mission-1子进程ID:46296
mission-1子进程的父进程为:7500
用户张三正在第1次执行任务一。
用户李四正在第2次执行任务二。
用户张三正在第2次执行任务一。
用户李四正在第3次执行任务二。
用户张三正在第3次执行任务一。
用户李四正在第4次执行任务二。
用户张三正在第4次执行任务一。
用户李四正在第5次执行任务二。
用户张三正在第5次执行任务一。

"""

两个子进程的父ID是相同的就是MainProcess这个主进程的ID

三、进程特点

  • 多进程之间不会共享全局变量
  • 主进程会默认等待子进程结束而结束 但可以通过设置来让子进程跟着主进程结束而结束

正常情况:

import multiprocessing
import time

def mission1(user, n):
    for i in range(1, n + 1):
        print(f"用户{user}正在第{i}次执行任务一。")
        time.sleep(0.1)

if __name__ == '__main__':
    print(f'--------主进程{multiprocessing.current_process().name}开始执行--------')
    p1 = multiprocessing.Process(target=mission1, name='mission-1', args=('张三', 5))
    p1.start()
    time.sleep(0.4) # 让主进程多执行一会儿
    print(f'----------主进程:{multiprocessing.current_process().name}最后一行代码执行完毕---------')

"""
--------主进程MainProcess开始执行--------
用户张三正在第1次执行任务一。
用户张三正在第2次执行任务一。
----------主进程:MainProcess最后一行代码执行完毕---------
用户张三正在第3次执行任务一。
用户张三正在第4次执行任务一。
用户张三正在第5次执行任务一。
"""

正常情况下,主进程(最后一行代码执行完了)仍然会等待子进程(p1 mission-1)执行完毕.

使用守护进程或者终止进程

import multiprocessing
import time


def mission1(user, n):
    for i in range(1, n + 1):
        print(f"用户{user}正在第{i}次执行任务一。")
        time.sleep(0.1)


if __name__ == '__main__':
    print(f'--------主进程{multiprocessing.current_process().name}开始执行--------')

    p1 = multiprocessing.Process(target=mission1, name='mission-1', args=('张三', 5))
    # 方式1: 开启子进程前提前设置守护主进程
    p1.daemon = True
    p1.start()
    time.sleep(0.4)  # 让主进程多执行一会儿
    # p1.terminate()
    print(f'----------主进程:{multiprocessing.current_process().name}最后一行代码执行完毕---------')

"""
--------主进程MainProcess开始执行--------
用户张三正在第1次执行任务一。
用户张三正在第2次执行任务一。
----------主进程:MainProcess最后一行代码执行完毕---------
"""

我们发现子进程还没执行结束就被终止了。

  • 多进程之间是无序的

以上就是Python使用multiprocessing实现多进程的详细内容,更多关于Python multiprocessing多线程的资料请关注脚本之家其它相关文章!

相关文章

  • windows下的pycharm安装及其设置中文菜单

    windows下的pycharm安装及其设置中文菜单

    这篇文章主要介绍了windows下的pycharm安装及其设置中文菜单,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • python分批定量读取文件内容,输出到不同文件中的方法

    python分批定量读取文件内容,输出到不同文件中的方法

    今天小编就为大家分享一篇python分批定量读取文件内容,输出到不同文件中的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python键鼠操作自动化库PyAutoGUI简介(小结)

    Python键鼠操作自动化库PyAutoGUI简介(小结)

    这篇文章主要介绍了Python键鼠操作自动化库PyAutoGUI简介,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • Python Tkinter创建GUI应用程序的示例

    Python Tkinter创建GUI应用程序的示例

    Tkinter提供了丰富的功能和灵活的接口,让开发者能够轻松地构建出各种各样的图形用户界面,本文介绍了使用Python的Tkinter库创建图形用户界面GUI应用程序,感兴趣的可以了解一下
    2024-12-12
  • 使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)

    使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)

    今天小编就为大家分享一篇使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • Pytorch中的广播机制详解(Broadcast)

    Pytorch中的广播机制详解(Broadcast)

    这篇文章主要介绍了Pytorch中的广播机制详解(Broadcast),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • Python调用ffmpeg开源视频处理库,批量处理视频

    Python调用ffmpeg开源视频处理库,批量处理视频

    本文主要介绍了如何用Python调用ffmpeg开源视频处理库,来实现视频批量的处理:水印、背景音乐、剪辑、合并、帧率、速率、分辨率等操作
    2020-11-11
  • python闭包和装饰器你了解吗

    python闭包和装饰器你了解吗

    这篇文章主要为大家详细介绍了Python的闭包和装饰器,何为闭包?何为装饰器?感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-08-08
  • 150行Python代码实现带界面的数独游戏

    150行Python代码实现带界面的数独游戏

    这篇文章主要介绍了150行Python代码实现带界面的数独游戏,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Python利用Matplotlib库实现绘制饼形图

    Python利用Matplotlib库实现绘制饼形图

    这篇文章主要为大家分享了基于python+matplotlib库的饼形图绘制,具体内容涉及一般的饼图、分裂饼图、以及环形图,感兴趣的小伙伴可以了解一下
    2022-04-04

最新评论