python --- multiprocessing实现多进程

2023-10-26

进程理论知识

进程就是正在运行的程序,是计算机进行资源分配的最小单位。
各个进程都有独立的数据,相互隔离

Linux里进程的状态

  • R 运行状态runable
  • S 中断睡眠态(TASK_INTERRUPTIBLE)
  • D 不可中断睡眠态(TASK_UNINTERRUPTIBLE)
  • Z 僵尸态:(TASK_ZOMBIE)
  • T/t 停止态(TASK_STOPPED)

所有进程都是由另外一个进程创建的。父进程 ---- 子进程
僵尸进程: 子进程退出时,父进程没有响应,即父进程没有调用wait()或者waitpid()去获取子进程的状态、 子进程的进程控制块就会依然保存在系统中,这种进程称之为僵尸进程。
孤儿进程: 父进程退出,子进程还在运行,那么子进程就是孤儿进程。孤儿进程会被pid为1的进程所收养。

multiprocessing模块实现多进程

multiprocessing包是Python中的多进程管理包。
与threading.Thread类似、 multiprocessing 模块使用Process创建进程、该Process对象与Thread对象的用法相同,也有start(), run(), join()的方法(参考我的上一篇多线程文章)

Process构造方法:Process(group=None, target=None, name=None, args=(), kwargs={})

  • group: 线程组,目前还没有实现,库引用中提示必须是None;
  • target: 要执行的方法;
  • name: 线程名;
  • args/kwargs: 要传入方法的参数、args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号;
    属性介绍:
  • t.name:获取或设置进程的名称
  • t.pid:获取进程的pid
  • t.is_alive()/t.isAlive():判断进程是否为激活状态。如果t仍然运行,返回True
  • t.run():进程被cpu调度后自动执行进程对象的run方法 ,run方法会调用传入的target方法
  • t.start(): 进程准备就绪,等待CPU调度,start会自动调用t.run()。
  • t.join([timeout]): 阻塞当前上下文环境的进程,直到调用此方法的进程终止或到达指定的timeout (可选参数)
  • t.setDaemon(): 设置为后台进程,主进程退出子进程也退出。默认为前台进程(False),主进程执行完了,等子进程执行完再退出)。
from multiprocessing import Process, current_process
import time

lst = []
def task(i):
    print(current_process().name, i, 'start...') # current_process().name输出进程的名字
    time.sleep(2)
    lst.append(i)
    print(lst)
    print(current_process().name, i, 'end.....')

if __name__ == "__main__":
    p_lst = []
    for i in range(4):
        p = Process(target=task, args=(i,))
        p_lst.append(p)
        p.start()
    for p in p_lst:
        p.join()    # 阻塞当前进程,直到子进程全部退出
    print("main end.......")

使用多进程需要注意:必须使用if __name__ == "__main__":,表示只有直接调用当前模块时(即主程序)name才等于main,如果该程序是被当作模块导入,则不会执行。

进程池

进程池采用预创建的技术、在应用启动之初便预先创建一定数目的进程
python中使用 multiprocessing.Pool创建一个进程池
示例: p = Pool(processes=4, maxtasksperchild=3)
processes=4 表示进程池内4个子进程,建议进程数与CPU核数一致。另外还有主进程管理他们,kill掉一个子进程后又会自动启动一个
maxtasksperchild=3 表示每一个进程最多处理3个任务,然后该进程就结束,主进程会再开启新的进程去处理剩下的任务、释放已完成任务的内存空间。

from multiprocessing import Pool, current_process
import time

lst = []
def task(i):
    print(current_process().name, i, 'start...')
    time.sleep(2)
    lst.append(i)
    print(lst)
    print(current_process().name, i, 'end.....')


if __name__ == "__main__":
    p = Pool(processes=4, maxtasksperchild=3)
    for i in range(20):
        p.apply_async(func=task, args=(i,))		# 进程池接收任务
    p.close()	# 关闭进程池 ==》 不接受任务
    p.join()	# 等待子进程执行完毕,父进程再执行
    print("end.............")

运行结果展示
这里我们可以看出、首先SpawnPoolWorker-1、SpawnPoolWorker-2、SpawnPoolWorker-3、SpawnPoolWorker-4 这4个进程都会分别去获取任务并执行,当执行了3个任务后、我们发现进程池内的程序变成了SpawnPoolWorker-5、SpawnPoolWorker-6、SpawnPoolWorker-7、SpawnPoolWorker-8,而前4个进程则被释放掉了。

D:\softs\python\python.exe E:/project/sanchuang/python基础/多进程多线程协程/code_进程池.py
SpawnPoolWorker-1 0 start...
SpawnPoolWorker-2 1 start...
SpawnPoolWorker-3 2 start...
SpawnPoolWorker-4 3 start...
[0]
SpawnPoolWorker-1 0 end.....
SpawnPoolWorker-1 4 start...
[2]
[1]
SpawnPoolWorker-3 2 end.....
SpawnPoolWorker-2 1 end.....
SpawnPoolWorker-2 5 start...
SpawnPoolWorker-3 6 start...
[3]
SpawnPoolWorker-4 3 end.....
SpawnPoolWorker-4 7 start...
[0, 4]
SpawnPoolWorker-1 4 end.....
SpawnPoolWorker-1 8 start...
[1, 5]
[2, 6]
SpawnPoolWorker-2 5 end.....
SpawnPoolWorker-3 6 end.....
SpawnPoolWorker-3 9 start...
SpawnPoolWorker-2 10 start...
[3, 7]
SpawnPoolWorker-4 7 end.....
SpawnPoolWorker-4 11 start...
[0, 4, 8]
SpawnPoolWorker-1 8 end.....
[2, 6, 9]
SpawnPoolWorker-3 9 end.....
[1, 5, 10]
SpawnPoolWorker-2 10 end.....
[3, 7, 11]
SpawnPoolWorker-4 11 end.....
SpawnPoolWorker-5 12 start...
SpawnPoolWorker-6 13 start...
SpawnPoolWorker-7 14 start...
SpawnPoolWorker-8 15 start...
[12]
SpawnPoolWorker-5 12 end.....
SpawnPoolWorker-5 16 start...
[13]
SpawnPoolWorker-6 13 end.....
SpawnPoolWorker-6 17 start...
[14]
SpawnPoolWorker-7 14 end.....
SpawnPoolWorker-7 18 start...
[15]
SpawnPoolWorker-8 15 end.....
SpawnPoolWorker-8 19 start...
[13, 17]
[12, 16]
SpawnPoolWorker-6 17 end.....
SpawnPoolWorker-5 16 end.....
[14, 18]
SpawnPoolWorker-7 18 end.....
[15, 19]
SpawnPoolWorker-8 19 end.....
end.............

Process finished with exit code 0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python --- multiprocessing实现多进程 的相关文章

  • 如何忽略 OpenCV python 中的内部黑色轮廓?

    在上图中 我只需要以下轮廓 8 7 0 2 4 里面每隔一个轮廓都是黑色的空盒子 有没有办法使用 cv2 RETR TREE 自动提取此类轮廓 cv2 RETR EXTERNAL 将忽略我实际需要的 2 和 4 gt gt heirarch
  • gevent 无法在 OS X Capitan 上的 python 虚拟环境中安装

    我刚刚安装了 OS X Capitan 并尝试在 python2 7 x 虚拟环境中安装 gevent 这就是我得到的 看起来像是与 gcc 有关的东西 这是回溯 Building wheels for collected packages
  • Python ImportError“无法导入名称'multiarray'

    我试图简单地将 numpy 导入到 python 脚本中 使用 PyCharm 称为 MatPlotLib py 但收到了这个奇怪的错误 它工作得很好 但后来我开始摆弄 Jupyter 我尝试卸载并重新安装 Python 然后系统恢复 但似
  • 为什么这个游戏无法开始,它正在循环[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我已经检查了这段代码的每一寸 我无法找出是什么导致它进入循环 一旦我按下按键开始 它就会播放开始噪音 然后它会转到结束屏幕 并说按按键再次
  • 如何在mongoengine中通过oid搜索文档

    我需要通过 oid 从 db 获取文档 例如 Docs objects id 4f4381f4e779897a2c000009 但如何做到这一点 如果 id 需要 ObjectId 对象 即使我尝试从 pymongo 设置 ObjectId
  • python 列表理解 double for

    vec 1 2 3 4 5 6 7 8 9 print num for elem in vec for num in elem lt this gt gt gt 1 2 3 4 5 6 7 8 9 这是在骗我 我知道 elem 是列表中的列
  • 在 Python Pandas 中使用 groupby 按列连接行

    而不是例如使用 group by 计算总和 我想连接同一组中的所有行 下面的代码应该只组合 连接行 而不是 sum 如果每组有 5 行 则新数据框的列数将是 5 倍 每列 x 5 例子 这是我现在拥有的数据框 Index Pool B C
  • 使用 Python 进行 requests.get() 后 PDF 文件损坏

    我正在尝试使用 requests get 下载 PDF 文件 它适用于我发现的大多数测试 PDF 文件 但对于本例则不起作用 并且文件已损坏 如果我用浏览器打开 URL 并保存文件 它就可以正常工作 我尝试使用 Stream 分块下载它 但
  • 解析维基百科的出生和死亡日期?

    我正在尝试编写一个 python 程序 可以在维基百科中搜索人们的出生和死亡日期 例如 阿尔伯特 爱因斯坦出生于 1879 年 3 月 14 日 逝世日期 1955 年 4 月 18 日 我开始于使用 Python 获取维基百科文章 htt
  • pyaudio 可以同时演奏两个音符吗?

    可以使用 pyaudio 演奏和弦吗 当然 只需生成结果并将其传递给玩家即可 本文介绍了一种实现此目的的方法 http davywybiral blogspot com br 2010 09 procedural music with py
  • 运行包含 Pipes 的命令行并将结果显示到 STDOUT

    如何从 Python 调用包含管道的 shell 命令并捕获输出 假设命令类似于 cat file log tail 1 我想做的 Perl 等效项是这样的 my string cat file log tail 1 使用 subproce
  • 导入错误:没有名为 psycopg2 的模块

    在 OpenERP 6 的安装过程中 我想使用以下命令生成一个配置文件 cd home openerp openerp server bin openerp server py s stop after init c home opener
  • 使用 Python 移动特定文件类型

    我知道这对你们中的许多人来说会非常容易 我刚刚开始学习 Python 需要一些基本文件处理方面的帮助 我拍摄了很多屏幕截图 最终出现在我的桌面上 因为这是默认设置 我知道我可以更改屏幕截图设置以自动将其保存在其他位置 不过 我认为这个程序将
  • Python 3 中的 FastCGI WSGI 库?

    对于 Python 3 是否存在可以将 WSGI 应用程序用作 FastCGI 服务器的库 这样 nginx 就可以将请求代理给它了 Python 3 文档 https docs python org 3 howto webservers
  • Azure 函数 python 命名参数没有值

    我目前正在 azure 函数中使用 python 创建一个计时器触发器 该触发器聚合来自 blob 存储的数据 并将结果放入 cosmosDB 中 我的问题如下 当我在绑定路径中使用特定文件时 函数按预期运行 每当我更改它 以便获取容器中的
  • 当相机断开连接时,opencv videocapture 挂起/冻结而不是返回“False”

    我正在使用 OpenCV Python 3 1 遵循此处的示例代码 http opencv python tutroals readthedocs io en latest py tutorials py gui py video disp
  • 使用类的 __new__ 方法作为工厂:__init__ 被调用两次

    我在 python 中遇到了一个奇怪的错误 其中使用 new 将类的方法作为工厂会导致 init 实例化类的方法被调用两次 这个想法最初是为了使用 new 母类的方法根据传递的参数返回其子类之一的特定实例 而无需在类外部声明工厂函数 我知道
  • 如何按顺序检查一个列表是否是另一个列表的子序列[重复]

    这个问题在这里已经有答案了 我有一个清单input 1 2 4 3 5 7 5 3 8 3 8 5 8 5 9 5 7 5 7 4 9 7 5 7 4 7 4 7 8 9 7 5 7 5 4 9 3 4 8 4 8 5 3 5 4 7 3
  • Python - 绘制具有不均匀误差(高和低)的误差条形图[重复]

    这个问题在这里已经有答案了 我是 Stack Overflow 的新手 所以如果这是一个重复的问题或含糊不清 我深表歉意 我对 Python 和一般编码也是新手 我想创建一个误差条形图 该图在高点和低点上具有不相等的 错误限制 我将绘制一个
  • Python Reportlab 中的动态帧大小

    我尝试生成一个发货清单报告实验室 questions tagged reportlab在Python中 我试图使用 Platypus 将所有部分 如发件人地址 收件人地址 表格 放在适当的位置Frames 第一个问题我遇到的问题是我需要很多

随机推荐

  • react+antd+table实现表格数据,从头到尾循环、自动分页、滚动展示

    ts写法 分页是20 滚动过程中自动分页调接口返回数据 class Demo extends React Component
  • python调用resnet模型 对人脸图片进行特征提取,提取全连接层特征向量

    resnet feature extraction import os os chdir root caffe master examples import numpy as np import matplotlib pyplot as p
  • 汇编语言----mul指令

    mul指令 把操作数与AX相乘 最后存放在AX中 例子 mov ax 4 mov bx 5 mul bx ax 20
  • 动态设置src路径

    img class sidebar logo data return logo require assets dt logo png 如上动态设置图片的路径需要使用require 不然只能写上固定路径如下 img src assets dt
  • 排行榜|当 DB-Engines 遇见墨天轮国产数据库排行

    提到数据库排名 此时脑海里浮现出的是什么 是 DB Engines 还是墨天轮数据库排行 两者间有什么区别 下面来聊一下业内这两个知名数据库排名平台 本篇文章约有 3000 字 预计阅读时间 7 分钟 如阅读时间有限 请直接阅读文章末尾的对
  • 软件测试/测试开发丨容器编排K8S 下部署分布式UI自动化解决方案

    本文作者为霍格沃兹测试开发学社特约讲师乔巴 K8S目前是业界容器编排领域的事实标准 是几乎所有云原生架构的首选 目前随着云原生架构越来越流行 测试开发人员需要掌握K8S技术栈已经成为越来越迫切的需求 Kubernetes 开源于 2014
  • 敏捷开发-如何理解spring x

    2021年 不断思考一年 从领导风格转变让自己有点不适应 但是一直让自己谦卑心去学习每个人身上特长东西 接触过很多管理者 但是身上特点不足够明显的领导 我觉得不适合这个岗位 所以更多的调整心态去适应 找到每一个天 每个月 每一年战略目标自己
  • vc的编译过程

    对VC 工程编译过程的梳理 VC 的项目和解决方案文件解读 无非就是利用这些信息进行一个软件的编译 这些文件里面是存放的项目的配置和工程的组织 类似于makefile文件 但是只有VC 6 0的时候可以导出makefile文件 VC6的pr
  • python3 [爬虫入门实战]爬虫之scrapy爬取中国医学人才网

    自己第一次试着用scrapy进行爬取网页 总共爬下9240条数据 也就两分钟不到 400多页吧 用的比较简单 但是爬取成功后感觉成就感满满的 来张爬取结果图 爬取字段 hospitalName hospitalDesc hospitalSi
  • 【满分】【华为OD机试真题2023B卷 JS】乱序整数序列两数之和绝对值最小

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 乱序整数序列两数之和绝对值最小 知识点排序数组 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 给定一个随机的整数 可能存在正整数和负整数 数组 nums 请你在该数组
  • X11协议基础与实践

    X11协议基础与实践 概念 X11 X Window System 是一种位图显示的视窗系统 X表示X协议 11是协议版本号 X 协议主要由 X server 和 X client 组成 l X server 管理主机上与显示相关的硬件设置
  • 对角线遍历

    param number matrix return number var findDiagonalOrder function matrix if matrix null matrix length 0 return let m matr
  • “40道高频区块链面试题”——我的一些看法

    最近看到了一篇文章如下 超强攻略 40道高频区块链面试题大放送 年底跳槽看过来 地址我也贴出来吧 https mp weixin qq com s 3Fa2XG4R11QDfMSAaBCngw 哦 CSDN的地址也出来了 https blo
  • vscode好用的前端插件和快捷键

    用到好用的vscode插件 总结一下 文章目录 一 常用主题 1 Material Theme主题 2 Community Material Theme主题 3 vscode icons 二 基础插件 1 Code Spell checke
  • java生成二维码图片(有logo),并在图片下方附文字

    logo配置类 Created by Amber Wang on 2017 11 27 17 25 import java awt public class LogoConfig logo默认边框颜色 public static final
  • 【数据结构】 实现 堆 结构 ---超细致解析

    目录 二叉树的性质 二叉树的存储结构 顺序存储 链式存储 堆的概念和性质 堆的实现 堆的初始化 堆的插入 向上调整函数 堆的删除 向下调整函数 向上建堆 向下建堆 TopK问题 二叉树的性质 在我们实现堆之前我们要知道堆的实现是依靠的是二叉
  • C# Thread启动线程时传递参数

    目录 1 不带参数 使用ThreadStart 2 带一个参数 使用ParameterizedThreadStart 3 带多个参数 1 不带参数 使用ThreadStart private void funcName public voi
  • Java反射学习记录

    一 反射概述 反射允许程序在运行中获取类的内部信息 例如构造器 成员变量 成员方法等 类加载之后 在堆中生成一个Class类的对象 一个类只有一个Class对象 这个对象包含类的完整结构信息 二 入门案例 通过配置文件中的内容生成指定类的对
  • 创建完整团队的艺术:敏捷如何改变我们与客户的工作方式

    来源 Ackarlix博客 http www ackarlix com 十年前 敏捷宣言 的作者们希望我们重新思考 我们作为程序员与客户协作的方式 我和我的博士学位顾问Robert Biddle以及James Noble都深受启发 充满希望
  • python --- multiprocessing实现多进程

    文章目录 进程理论知识 multiprocessing模块实现多进程 进程池 进程理论知识 进程就是正在运行的程序 是计算机进行资源分配的最小单位 各个进程都有独立的数据 相互隔离 Linux里进程的状态 R 运行状态runable S 中