Python进程multiprocessing.Process()的使用解读

 更新时间:2024年02月24日 09:32:40   作者:埃菲尔没有塔尖  
这篇文章主要介绍了Python进程multiprocessing.Process()的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1.进程概念

进程是资源分配的最小单位,程序隔离的边界。


CPU的时间片轮转,在不同的时间段切换执行不同的进程,但是切换进程是比较耗时的;就引来了轻量级进程,也就是所谓的线程,一个进程中包括多个线程(代码流,其实也就是进程中同时跑的多个方法体)

  • 程序:例如xxx.py这是程序,是一个静态的
  • 进程:一个程序运行起来后,代码+用到的资源 称之为进程,它是操作系统分配资源的基本单元。

2.进程的状态

工作中,任务数往往大于cpu的核数,即一定有一些任务正在执行,而另外一些任务在等待cpu进行执行,因此导致了有了不同的状态


  • 就绪态:运行的条件都已经满足,正在等在cpu执行
  • 执行态:cpu正在执行其功能
  • 等待态:等待某些条件满足,例如一个程序sleep了,此时就处于等待态

3.进程的创建-multiprocessing

multiprocessing模块就是跨平台版本的多进程模块,提供了一个Process类来代表一个进程对象,这个对象可以理解为是一个独立的进程,可以执行另外的事情。

方法说明:

创建子进程跟创建线程十分类似,只需要传入一个执行函数和函数的参数,创建一个Process实例,用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:当前进程的pid(进程号)

代码示例:

import multiprocessing
import time

def work1():
    for i in range(10):
        print("work1----", i)
        time.sleep(0.5)

if __name__ == '__main__':
    # 创建进程
    # 1. 导入 multiprocessing 模块
    # 2. multiprocessing.Process() 创建子进程
    # 3. start() 方法启动进程

    p1 = multiprocessing.Process(group=None, target=work1)
    p1.start()

    for i in range(10):
        print("这是主进程", i)
        time.sleep(0.5)

4.进程名称获取

multiprocessing.current_process()


5. 获取进程pid

有两种方法可以获取

1)multiprocessing.current_process().pid

2)使用import os模块的getpid()

import multiprocessing
import time
import os

def work():
    # 获取进程的名称
    print(multiprocessing.current_process())
    # 获取进程的pid
    print(multiprocessing.current_process().pid, os.getpid())

    i = 0
    while i < 10:
        print("work中执行", i)
        time.sleep(0.5)
        i = i + 1

if __name__ == '__main__':
    # 获取进程的pid
    print(multiprocessing.current_process())
    # 创建子进程
    process1 = multiprocessing.Process(group=None, target=work)
    process1.start()

    i = 0
    while i < 10:
        print("我在主线程中执行",i)
        time.sleep(0.3)
        i = i + 1


 

获取父id: getppid() 获取父进程id

6.子进程参数传递

给子进程传递参数方法和给子线程传递参数方法基本一致!


7.进程间不共享全局变量

import multiprocessing
# 定义全局变量
num = 100

# 定义work方法,设置num1的值
def work():
    global num       # 在函数内部声明使用全局变量num
    num = num + 1    # 对num值进行+1
    print("work num = %d" % num)

# 定义work2方法,获取num1的值
def work2():
    print("work2 num = %d" % num)

if __name__ == '__main__':
    # 创建子进程
    process1 = multiprocessing.Process(group=None, target=work, name="MyProcess")
    process1.start()

    # 创建第二个子进程
    process2 = multiprocessing.Process(group=None, target=work2, name="MyProcess2")
    process2.start()

运行结果:

work num = 101
work2 num = 100

由运行结果可以看出,work函数对num1的修改,在work2中并没有获取到,而还是原来的100,所以,进程之间是不能够共享变量的

8.守护主进程

import multiprocessing
import time

def sub_process():
    for i in range(10):
        print("子进程运行中", i)
        time.sleep(0.5)

if __name__ == '__main__':
    # 创建子进程
    p1 = multiprocessing.Process(group=None, target=sub_process, name="p1")
    # 设置守护主进程
    # 第一种方式:
    # p1.daemon = True
    # 第二种方式(最好在退出exit()前一句使用):
    # p1.terminate()
    # 启动
    p1.start()

    time.sleep(2)
    print("OVER!")
    p1.terminate()
    exit()

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python时间的精准正则匹配方法分析

    Python时间的精准正则匹配方法分析

    这篇文章主要介绍了Python时间的精准正则匹配方法,结合实例形式对比分析了Python针对时间格式相关正则匹配技巧,需要的朋友可以参考下
    2017-08-08
  • python实现数据清洗(缺失值与异常值处理)

    python实现数据清洗(缺失值与异常值处理)

    今天小编就为大家分享一篇python实现数据清洗(缺失值与异常值处理),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Python封装原理与实现方法详解

    Python封装原理与实现方法详解

    这篇文章主要介绍了Python封装原理与实现方法,结合实例形式较为详细的分析了Python封装的概念、原理、实现方法及相关操作注意事项,需要的朋友可以参考下
    2018-08-08
  • python的数据与matlab互通问题:SciPy

    python的数据与matlab互通问题:SciPy

    这篇文章主要介绍了python的数据与matlab互通问题SciPy,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • python字典保存为json后读取出错问题及解决

    python字典保存为json后读取出错问题及解决

    这篇文章主要介绍了python字典保存为json后读取出错问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Python实现批量将CSV按行或按列拆分

    Python实现批量将CSV按行或按列拆分

    这篇文章主要介绍了一个基于Python标准库csv和PyQt5的高性能CSV拆分工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2026-03-03
  • python中list列表复制的几种方法(赋值、切片、copy(),deepcopy())

    python中list列表复制的几种方法(赋值、切片、copy(),deepcopy())

    本文主要介绍了python中list列表复制的几种方法(赋值、切片、copy(),deepcopy()),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Python脚本实现自动替换文件指定内容

    Python脚本实现自动替换文件指定内容

    这篇文章主要为大家详细介绍了如何编写一个py脚本,可以实现自定义替换py文件里面指定内容,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-03-03
  • Python入门之字典的使用教程

    Python入门之字典的使用教程

    Python字典是一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型。本文将为大家详细讲讲字典的使用教程,需要的可以参考一下
    2022-09-09
  • 使用Python搭建轻量级静态网页服务器的示例详解

    使用Python搭建轻量级静态网页服务器的示例详解

    这篇文章主要为大家详细介绍了如何使用Python搭建一个轻量级静态网页服务器,零基础也能实现的Web开发初体验,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-07-07

最新评论