我的编程空间,编程开发者的网络收藏夹
学习永远不晚

像线程一样管理进程的Python multiprocessing库

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

像线程一样管理进程的Python multiprocessing库

目录
  • 一、创建一个进程
  • 二、设置进程名
  • 三、守护进程
  • 四、join()
  • 五、强制结束进程
  • 六、进程退出状态码
  • 七、日志
  • 八、派生进程

一、创建一个进程

要创建一个进程,最简单的方式是用一个目标函数实例化一个Process对象,然后与threading一样调用start()函数让它工作。示例如下:


import multiprocessing

def worker():
    for i in range(3):
        print(i)

if __name__=="__main__":
    p = multiprocessing.Process(target=worker)
    p.start()

运行之后,效果如下:

效果

需要注意的是,multiprocessing库在Windows创建进程必须在if __name__=="__main__":中,这是 Windows 上多进程的实现问题。在 Windows 上,子进程会自动 import 启动它的这个文件,而在 import 的时候是会执行这些语句的。如果直接创建就会无限递归创建子进程报错。所以必须把创建子进程的部分用那个 if 判断保护起来,import 的时候 __name__ 不是 __main__ ,就不会递归运行了。

二、设置进程名

在threading线程中,我们可以通过其参数name设置线程名,同样的我们也可以通过name参数设置其进程的名字。示例如下:


import multiprocessing
import time

def worker():
    print(multiprocessing.current_process().name, "start")
    time.sleep(2)
    print(multiprocessing.current_process().name, "end")

if __name__ == "__main__":
    p1 = multiprocessing.Process(name='p1', target=worker)
    p2 = multiprocessing.Process(name='p2', target=worker)
    p3 = multiprocessing.Process(name='p3', target=worker)
    p1.start()
    p2.start()
    p3.start()

运行之后,效果如下:

name

三、守护进程

和线程一样,在所有子进程没有退出之前,主程序是不会退出的。有时候,我们可能需要启动一个后台进程,它可以一直运行而不阻塞主程序退出。

要标志一个守护进程,可以将其添加第3个参数daemon,设置为True。默认值为False,不作为守护进程。示例如下:


import multiprocessing
import time

def worker():
    print(multiprocessing.current_process().name, "start")
    time.sleep(1)
    print(multiprocessing.current_process().name, "end")

def worker2():
    print(multiprocessing.current_process().name, "start")
    time.sleep(2)
    print(multiprocessing.current_process().name, "end")

if __name__ == "__main__":
    p1 = multiprocessing.Process(name='p1', target=worker)
    p2 = multiprocessing.Process(name='p2', target=worker2, daemon=True)
    p3 = multiprocessing.Process(name='p3', target=worker2, daemon=True)
    p1.start()
    p2.start()
    p3.start()

运行之后,效果如下:

守护进程

p2,p3为守护进程,但p1不是所以执行1秒之后,就退出主程序了,也就没有打印p2p3的内容。但是其依旧在执行中,直到执行完成。

四、join()

同样的,如果你期望强制等待一个守护进程的结束,可以增加join()函数。还是上面的代码,示例如下:


import multiprocessing
import time

def worker():
    print(multiprocessing.current_process().name, "start")
    time.sleep(1)
    print(multiprocessing.current_process().name, "end")

def worker2():
    print(multiprocessing.current_process().name, "start")
    time.sleep(2)
    print(multiprocessing.current_process().name, "end")

if __name__ == "__main__":
    p1 = multiprocessing.Process(name='p1', target=worker)
    p2 = multiprocessing.Process(name='p2', target=worker2, daemon=True)
    p3 = multiprocessing.Process(name='p3', target=worker2, daemon=True)
    p1.start()
    p2.start()
    p3.start()
    p1.join()
    p2.join()
    p3.join()

   

运行之后,和设置进程名的运行结果一样,这里不在展示。唯一与守护进程代码的区别就是最后三行join()函数代码。当然,也可以像线程一样,给join()函数传入一个时间,超过这个时间,主进程不再等待。

五、强制结束进程

如果一个进程已经挂起或者不小心进入了死锁状态,那么这个时候,我们往往会强制的结束进程。对一个进程对象调用terminate()会结束子进程。示例如下:


import multiprocessing
import time

def worker():
    print(multiprocessing.current_process().name, "start")
    time.sleep(5)
    print(multiprocessing.current_process().name, "end")

if __name__ == "__main__":
    p1 = multiprocessing.Process(name='p1', target=worker)
    p1.start()
    print("是否还在运行", p1.is_alive())
    p1.terminate()
    print("是否还在运行", p1.is_alive())
    p1.join()
    print("是否还在运行", p1.is_alive())

运行之后,输出如下:

强制结束进程

终止进程后要使用join()函数等待进程的退出。使进程管理代码有足够的时间更新对象的状态,以反应进程已经终止。

六、进程退出状态码

进程退出时,生成的状态码可以通过exitcode属性访问。下表就是其状态码的取值范围以及其意义:

退出码 含义
0 未生成任何错误
>0 进程有一个错误,并以该错误码退出
<0 进程以一个-1*exitcodde信号结束

测试如下:


import multiprocessing
import time

def worker():
    print(multiprocessing.current_process().name, "start")
    time.sleep(5)
    print(multiprocessing.current_process().name, "end")

if __name__ == "__main__":
    p1 = multiprocessing.Process(name='p1', target=worker)
    p2 = multiprocessing.Process(name='p2', target=worker)
    p1.start()
    p2.start()
    print("是否还在运行", p1.is_alive())
    p1.terminate()
    print("是否还在运行", p1.is_alive())
    print(p1.exitcode)
    p1.join()
    print("是否还在运行", p1.is_alive())
    print(p1.exitcode)
    time.sleep(5.5)
    print(p2.exitcode)

运行之后,效果如下:

错误码

可以看到,强制退出的进程状态码为负数,正常退出的进程状态码为0。

七、日志

调试并发问题时,如果能够访问multiprocessing所提供对象的内部状态,那么这会很有用。在实际的项目中,我们可以使用一个方便的模块级函数启用日志记录,它使用logging建立一个日志记录器对象,并增加一个处理器,使日志消息被发送到标准错误通道。

示例如下:


import multiprocessing
import logging
import sys

def worker():
    print("运行工作进程")
    sys.stdout.flush()

if __name__ == "__main__":
    multiprocessing.log_to_stderr(logging.DEBUG)
    p1 = multiprocessing.Process(name='p1', target=worker)
    p1.start()
    p1.join()

运行之后,效果如下:

logging

八、派生进程

与线程一样,我们可以自定义进程,而不必只是传入一个函数进行进程的创建。

创建的进程的方式也是派生自进程类即可。示例如下:


import multiprocessing

class WorkerProcess(multiprocessing.Process):
    def run(self):
        print(self.name)
        return

if __name__ == "__main__":
    for i in range(5):
        p = WorkerProcess()
        p.start()
        p.join()

运行之后,效果如下:

自定义进程

multiprocessing库的进程知识与threading一样长,因为本篇的内容已经够长了,剩下的知识我们将在下一篇博文中接着讲解。

到此这篇关于像线程一样管理进程的Python multiprocessing库的文章就介绍到这了,更多相关Python multiprocessing库内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

像线程一样管理进程的Python multiprocessing库

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

像线程一样管理进程的Python multiprocessing库

目录一、创建一个进程二、设置进程名三、守护进程四、join()五、强制结束进程六、进程退出状态码七、日志八、派生进程一、创建一个进程 要创建一个进程,最简单的方式是用一个目标函数实例化一个Process对象,然后与threading一样调用
2022-06-02

python多进程multiprocessing的原理和应用

这篇文章主要介绍“python多进程multiprocessing的原理和应用”,在日常操作中,相信很多人在python多进程multiprocessing的原理和应用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家
2023-06-20

Python多进程库multiprocessing中进程池Pool类的使用详解

问题起因 最近要将一个文本分割成好几个topic,每个topic设计一个regressor,各regressor是相互独立的,最后汇总所有topic的regressor得到总得预测结果。没错!类似bagging ensemble!只是我没有
2022-06-04

Linux进程和线程的基础和管理

本篇内容主要讲解“Linux进程和线程的基础和管理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux进程和线程的基础和管理”吧!一.进程的基本概念 程序是为了完成某种任务而设计的软件,比如
2023-06-13

linux系统进程管理是怎样的

本篇内容介绍了“linux系统进程管理是怎样的”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、进程与线程的概念来源百度百科:进程(Proc
2023-06-22

Python下进程与线程的原理及区别

对于所有的语言都可能会遇到进程和线程的问题,一般情况下线程是由进程产生的,一个进程产生多个线程来按照一定的规则(Python下根据CPU调度算法和全局进程锁)来利用CPU,我们称之为多线程模式;而一个进程在产生的同时,同时会生成一个主线程,
2023-01-31

Linux内核进程管理的基础是怎样的

本篇文章为大家展示了Linux内核进程管理的基础是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。内核通过 task_struct 描述进程用命令 pstree 可以让内核以树形的结构把进程之间
2023-06-15

信息系统管理工程师各省分数线是不是一样的

  各省信息系统管理工程师考试的国家分数线都是统一的,但是有少数省份有分国家分数线和省内分数线。如果是达到了省内分数线,也是可以领取省级软考信息系统管理工程师证书的。  各省软考中级信息系统管理工程师分数线是全国统一的,但是有少数省份有分全国分数线和省内分数线,比如青海和陕西。  省内分数线一般会比全国分数线要低,如2
信息系统管理工程师各省分数线是不是一样的
2024-04-18

操作系统:用户级线程与内核级线程——探析进程管理的奥秘

用户级线程和内核级线程是操作系统进程管理中的两种重要概念,它们在实现并发编程方面有着不同的原理和应用场景。本文将对这两种线程进行深入探讨,并通过演示代码来说明它们的差异和优缺点。
操作系统:用户级线程与内核级线程——探析进程管理的奥秘
2024-02-03
掌握异步编程的艺术:让 Python 像光速一样快
2024-03-09

如何实现Python底层技术的线程管理

抱歉,我在本平台上无法提供直接的代码示例。是否有其他方面的信息我可以帮助你呢?
如何实现Python底层技术的线程管理
2023-11-08

一个完整的缺陷管理流程是什么样的

一个完整的缺陷管理流程是:一、缺陷发现;二、缺陷记录;三、缺陷分类和优先级划分;四、缺陷分析;五、缺陷解决;六、缺陷验证和关闭。缺陷发现是软件质量保证的重要环节,它可以帮助开发人员及时发现并修复软件中的问题,以确保软件的质量和可靠性。
一个完整的缺陷管理流程是什么样的
2023-10-29

Python中多线程和多处理的指南是怎样的

Python中多线程和多处理的指南是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。使用Python分析数据,如果使用了正确的数据结构和算法,有时可以大量提高程序的速度。实
2023-06-05

python进程监控及管理的方法是什么

在Python中,可以使用以下方法来监控和管理进程:1. 使用`subprocess`模块创建和管理子进程。`subprocess`模块提供了一些函数和类来创建和控制子进程,如`subprocess.run()`、`subprocess.P
2023-10-12

怎样用一个开源工具实现多线程 Python 程序的可视化

今天就跟大家聊聊有关怎样用一个开源工具实现多线程 Python 程序的可视化,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。VizTracer 可以跟踪并发的 Python 程序,以帮
2023-06-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录