Python multiprocessing 模块

Python中的进程multiprocessing模块 Python中的进程multiprocessing模块 文章目录Python中的进程multiprocessing模块Process进程类进程间同步 由于Python的GIL全局解释器锁存在,多线程未必是CPU密集型程序的好的选择。 多进程可以完全独立的进程环境中运行程序,可以较充分地利用多处理器。 但是进程本身的隔离带来的数据不共享也是一个问题。而且线程比进程轻量级。 Process类的设计遵... 阅读详情

由于 threading 多线程模块无法充分利用电脑的多核优势,而在实际开发中会对系统性能有较高的要求,就需要使用多进程来充分利用多核 cpu 的资源,下面详细介绍 Python 中的 multiprocessing。

multiprocessing 多进程模块有类似 threading 模块的 API 接口,方便熟悉 threading 的用户直接使用 multiprocessing。它支持子进程、通信和共享数据、执行不同形式的同步,下面简单介绍下几个常用的组件。

Process类

在 multiprocessing 中生成进程的方式是通过创建一个 Process 对象,然后调用它的 start() 方法来实现。例如:

from multiprocessing import Process
def f(name):
    print('hello', name)
if __name__ == '__main__':
    p = Process(target=f, args=('world',))
    #启动进程
    p.start()
    #实现进程间的同步,等待所有进程退出
    p.join()

#执行结果:
hello world

需要注意的是,在上面示例代码中使用了if __name__ == '__main__',这行代码是符合编程规范的。加上它可以确保主模块能够被新启动的 Python 解释器安全导入。

在启动进程的过程中,需要考虑执行顺序的问题,正常情况下是主进程先执行,子进程后执行。例如:

#主子进程执行顺序
from multiprocessing import Process
import os
import time
def run():
    print("子进程开启")
    time.sleep(2)
    print("子进程结束")

if __name__ == "__main__":
    print("主进程启动")
    p = Process(target=run)
    p.start()
    print("主进程结束")

#执行结果:
主进程启动
主进程结束
子进程开启
子进程结束

Queue类

因为不同进程之间内存是不共享的,要想实现进程间的通信,必须要提供中间的媒介。Python 提供了两个通信的对象类。一个是 Queue 类,另一个是 Pipe 类。

Queue 队列使用一个管道和少量锁和信号量实现的共享队列实例,它是线程和进程安全的,常被用于两个进程之间的通讯。例如有一个 wirte 进程负责写数据,另外一个 read 进程负责读数据。当我们需要将写的数据交给读的进程时,可以通过 Queue 作为中间桥梁,先把 write 进程写的数据交给队列,再由队列将数据传递给 read 进程。

#Queue队列
from multiprocessing import Process, Queue
def f(q):
    q.put([11, None, 'lily'])
if __name__ == '__main__':
    q = Queue()
    p = Process(target=f, args=(q,))
    p.start()
    print(q.get())
    p.join()

#执行结果:
[11, None, 'lily']

在上述示例中调用了 join()函数,它可以阻塞主进程,直到调用 join()函数的进程终止。该函数有一个可选的参数 timeout,参数 timeout 的默认值是 None。如果 timeout 是一个正数,它最多会阻塞 timeout 秒。

Pipe类

Pipe 和 Queue 一样,可以作为进程之间通信的通道。Pipe()函数返回两个对象 conn1 和 conn2 ,这两个对象表示管道的两端。

Pipe()函数有一个可选参数 duplex,参数 duplex 的默认值为 True,表示该管道是双向的,即两个对象都可以发送和接收消息。如果把参数 duplex 设置为 False ,表示该管道是单向的,即 conn1 只能用于接收消息,conn2 只能用于发送消息。例如:

from multiprocessing import Process, Pipe
def f(conn):
    conn.send([11, None, 'lily'])
    conn.close()

if __name__ == '__main__':
    conn1, conn2 = Pipe()
    p = Process(target=f, args=(conn2,))
    p.start()
    print(conn1.recv())
    p.join()

#执行结果:
[11, None, 'lily']

从以上示例可以看出,Queue 和 Pipe 拥有相似的功能。但在日常开发中,两者使用的场景有所不同,Pipe 多用于两个进程间通信,而 Queue 则多用于两个及以上进程间的通信。

Lock类

由于多线程共享进程的资源和地址空间,因此,在对这些公共资源进行操作时,为了防止这些公共资源出现异常的结果,必须考虑线程的同步和互斥问题。为了保证进程间的同步,我们可以使用 Lock 类给线程或者进程加锁。Lock 返回的是一个非递归锁对象,Lock 实际上是一个工厂函数。它返回由默认上下文初始化的 multiprocessing.synchronize.Lock 对象。

一旦某一个进程或者线程拿到了锁,后续的任何其他进程或线程的其他请求都会被阻塞直到锁被释放。例如:

#!/usr/bin/python3
from multiprocessing import Process, Lock
def f(l, i):
    l.acquire()
    try:
        print('this is', i)
    finally:
        l.release()

if __name__ == '__main__':
    lock = Lock()

    for num in range(10):
        Process(target=f, args=(lock, num)).start()

#执行结果:
this is 0
this is 2
this is 3
this is 4
this is 1
this is 5
this is 6
this is 7
this is 8
this is 9

总结

本节给大家介绍了 Python 中 multiprocessing 模块的常用操作,对于实现基于进程的并行操作提供了支撑,注意与 threading 模块基于线程的并行操作区分开。

参考 

[1] https://docs.python.org/3.7/library/multiprocessing.html

[2] https://blog.youkuaiyun.com/brucewong0516/article/details/85796073

Python中使用multiprocessing模块创建进程 在`if __name__ == '__main__':`的条件下,我们创建了一个进程`p`,并将目标函数设为`worker`。在主程序中,我们创建了一个发送者进程`p`和一个接收者进程`c`,并将管道`child_conn`和`parent_conn`传递给它们。在主程序中,我们创建了一个生产者进程`p`和一个消费者进程`c`,并将队列`queue`作为参数传递给它们。在上述示例中,我们首先创建了一个队列`queue`,然后定义了一个生产者函数`producer`,用于向队列中放入数据。 阅读详情

相关推荐

强化学习技巧三:Python多进程

1.Python多进程模块 Python中的多进程是通过multiprocessing包来实现的,和多线程的threading.Thread差不多,它可以利用multiprocessing.Process对象来创建一个进程对象。这个进程对象的方法和线程对象的方法差不多也有start(), run(), join()等方法,其中有一个方法不同Thread线程对象中的守护线程方法是setDeamon,而Process进程对象的守护进程是通过设置daemon属性来完成的。 2.Python多进程实现方法一

丨汀、的博客 1152

多任务——进程

多任务 多任务:操作系统可以同时运行多个任务 并行:任务数小于cpu核数,任务一起执行 并发:任务数多于cpu核数,通过操作系统的各种任务调度算法,实现多个任务一起执行 进程 进程:操作系统分配资源和调度的单位,是一个执行中的程序,是资源分配最小单位 进程的创建:multiprocessing模块就是跨平台版本的多进程模块,提供了一个Process类来创建进程对象 fr...

weixin_30765505的博客 274

python-16-多进程模块multiprocessing

多进程

qq_20466211的博客 4188

Python入门之——进程multiprocessing(Process 类)简介

os.fork()方法:创建新进程 要知道,每个 Python 程序在执行时,系统都会生成一个新的进程,该进程又称父进程(或主进程)。在此基础上,Python os 模块还提供有 fork() 函数,该函数可以在当前程序中再创建出一个进程(又称子进程)。也就是说,程序中通过引入 os 模块,并调用其提供的 fork() 函数,程序中会拥有 2 个进程,其中父进程负责执行整个程序代码,而通过 fork() 函数创建出的子进程,会从创建位置开始,执行后续所有的程序(包含创建子进程的代码)。 注意,os.fork

肥叔菌的博客 8915

Python教程:深入理解 Python multiprocessing.Queue

在 Python 编程中,多进程编程是利用计算机多核心资源的重要手段之一。然而,多进程之间的通信却是一个相对复杂的问题。在本文中,我们将深入探讨 Python 中的 multiprocessing.Queue 模块,它为多进程间的通信提供了便捷而高效的解决方案。

旦莫的博客 3454

主流双目相机技术参数横向评测:从ZED到国产新锐

本文对主流双目相机技术参数进行了横向评测,涵盖ZED、Bumblebee等国际品牌及国产新锐产品。详细分析了分辨率、帧率、视场角等关键参数,并针对机器人导航、AR/VR交互、工业检测等场景提供选型建议。特别推荐ZED相机在科研领域的成熟应用,以及国产方案在长基线设计和主动双目技术上的创新突破。

weixin_33670786的博客 317

python中 multiprocessing模块安装

python中 multiprocessing模块安装 安装Python多线程包multiprocessing安装报错 本机环境: win7 X64 Python 3.7.0 CMD直接安装multiprocessing报错如下: 正确安装语句:pip3 install multiprocess: 然后进入python进行检测,检测结果类似下图,即表示multiprocessing安装完成...

weixin_44792487的博客 2万+

RK3588开发板DDR频率上不去?手把手教你用ddrbin_tool降频调优(附完整配置流程)

本文详细介绍了RK3588开发板DDR频率调优的完整解决方案,重点使用ddrbin_tool工具进行降频配置。从硬件原理分析到实战操作,包括参数导出、频率调整、二进制生成及烧录验证,帮助开发者解决DDR高频不稳定问题,提升系统可靠性。适用于嵌入式开发、工业控制等场景。

weixin_42713608的博客 543

Python 中如何使用 multiprocessing 模块实现进程编程

在 Python 中,多进程(multiprocessing)是一种能够并行执行任务的有效方式。相比多线程,Python 的多进程机制不受全局解释器锁(GIL)的限制,能够实现真正的并行计算,尤其适合 CPU 密集型任务。`multiprocessing` 模块为 Python 提供了多进程的创建、管理和数据共享机制。本文将详细介绍如何使用 `multiprocessing` 模块来实现进程池(Pool)和共享数据。

1168

鱼眼双目测距实战:从OpenCV标定到SGBM匹配的完整流程解析

本文详细解析了鱼眼双目测距的完整流程,从OpenCV标定到SGBM匹配,涵盖标定、校正、匹配和测距四个关键阶段。通过实战经验分享,帮助开发者解决鱼眼镜头强畸变带来的测距挑战,提升测距精度至5%以内。特别适合机器人导航、自动驾驶和VR领域的开发者参考。

weixin_27298377的博客 122

【顾邦小讲堂】第十九期 RC Snubber吸收电路详解:抑制MOSFET振铃现象与过冲的设计技巧!

通过RC Snubber电路有效抑制MOSFET DS端的过冲及振铃现象,帮助工程师们在设计中提升电路的稳定性和可靠性

GBupupup的博客 3783

python multiprocessing模块

python multiprocessing模块 原文地址 multiprocessing multiprocessing支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。 创建进程的类:Process([group[, target[, name[, args[, kwargs]]]]]) target表示调用对象 arg...

weixin_33857679的博客 226

HLM(多层线性模型)在stata中语句

在阅读CEPS中发现有些研究采用的是HLM模型,HLM简单来说用一个方程跑两个回归。举例,对学习成绩影响因素,不同层有不同的影响,如在个体层面上个体特征会对成绩产生影响,在学校层面学校排名等因素会对成绩产生影响,两种因素不在一个层面,每层造成的差异都不相同。 在找相关语句时候发现操作这个语句的软件大多是SPSS和HLM,对于stata操作者并不友好。因此,在有限资料中总结了HLM在stata中的语句,后面会附上学习视频和链接。 先放语句,后面对方程式一个大致解析。由于针对HLM有一本书的介绍,可能一篇文章无

weixin_44652251的博客 1万+

Python 从入门到实战35(进程-multiprocessing模块)

在了解进程之前,我们先明确一下多任务的概念。多任务,是指操作系统执行多个任务。例如我们的计算机打开了音乐、浏览器、电影等,这时就是多任务运行。上面说的每一个任务就是一个进程。所以,进程就是指计算机中已运行程序的实体。进程和程序的不同之处在于:程序本身是指指令、数据、及其组织形式的描述。进程是程序真正运行实例。例如没有打开微信之前是程序,打开运行就开启了一个进程。

立黄昏粥可温 1443

Oracle EBS AP发票被预付款核算创建会计科目时间超长

在客户职能部门的水电、通信和物业等费用统一管理或对接部门报销时,用户将所有费用分摊到各个末级部门,导致AP发票行数高达上千行。这引发了以下问题:1)用户过账时,创建会计科目的请求执行超过20小时未完成,只能手动取消;2)取消请求后,系统一直处于回滚状态;3)通过SQL脚本分析,发现预付发票核销分配行表记录数量庞大,单笔AP发票记录高达90多万条,类似发票共有5笔。

陈显平的专栏-Oracle EBS 351

第170篇 因子图优化入门——图模型在状态估计中的应用

本文系统介绍了从滤波方法到因子图优化的思维转变,重点解析了因子图的原理与应用。首先对比了递推式滤波(卡尔曼滤波等)与全局优化的区别,指出优化方法能利用所有信息且适合处理稀疏结构。然后详细阐述了因子图的二部图结构(变量节点和因子节点)及其将复杂概率分布分解为小因子乘积的优势。文章讲解了因子图优化如何转化为最小二乘问题,并介绍高斯-牛顿法和LM方法等求解技术。最后对比了g2o、Ceres和GTSAM三大主流框架的特点及适用场景,强调了初始化和鲁棒核函数的重要性,为SLAM相关面试提供了实用建议。

郑伟强dev的专栏 370

python multiprocessing_Python的multiprocessing模块详解

通过multiprocessing模块的Process类创建一个进程的实力,并通过run()的方法来运行他frommultiprocessingimportProcessimportosdefsub_hello(name):print('Hello,%s!MyprocessIDis%s'%(name,os.getpid()))if__name__=='__main__'...

weixin_39959482的博客 339

解锁激光加工密码:功率、频率、脉宽、占空比全解析

激光加工利用高能量激光束实现材料加工,具有无接触、高效率等特点。其核心参数包括功率(决定能量输出)、频率(控制脉冲重复)、脉宽(调节能量作用时间)和占空比(调控工作周期),这些参数相互协同影响加工效果。针对不同材料需采用差异化参数组合:金属材料需较高功率,塑料需低功率防过热,陶瓷需高频短脉宽减少热应力。实际操作中应通过小范围测试逐步优化参数,并注意解决烧损、切割不平整等常见问题。合理调节这些参数可实现高质量、高效率的激光加工。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 613

python multiprocessing模块 介绍

一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu\_count\(\)查看),在python中大部分情况需要使用多进程。 Python提供了multiprocessing。 multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threadi...

weixin_30566111的博客 194

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Python 多进程编程:multiprocessing 模块全面解析

模块是 Python 标准库的一部分,提供了创建和管理进程的高级接口。与多线程不同,每个进程都有自己独立的 Python 解释器和内存空间,因此不受 GIL 的限制,可以真正实现并行计算。该模块支持跨平台使用,在 Windows、Linux 和 macOS 等操作系统上都能正常工作。模块为 Python 开发者提供了强大的多进程编程能力。通过创建和管理进程、使用进程间通信机制和同步机制以及利用进程池,我们可以实现并行执行任务,充分发挥多核 CPU 的计算能力。

Tekin 是深耕技术 20 年的全栈实战派专家,精通 Go/Python/Java 等多语言开发。博客专注技术原理与实战结合,深度解析 Python 高阶编程、Go 语言架构、数据库优化等硬核内容。涵盖并发编程、机器学习、云原生等前沿领域,通过真实案例拆 2280

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Python标准库—multiprocessing模块

multiprocessing multiprocessing 是一个用与 threading模块相似API的支持产生进程的包。 multiprocessing包同时提供本地和远程并发,使用子进程代替线程,有效避免 Global Interpreter Lock(GIL)带来的影响。因此, multiprocessing模块允许程序员充分利用机器(Unix 或 Windows)上的多个核心。 mu...

L_zzwwen的博客 1148

python multiprocessing模块_python中multiprocessing模块

multiprocess模块那来干嘛的?答:利用multiprocessing可以在主进程中创建子进程。Threading是多线程,multiprocessing是多进程。#该模块和Threading模块使用方法基本类似。首先需要说明,你所使用多线程的函数不能有return,比如你要将job这个函数多线程那么在job这个函数里就不能有return,如果有返回值请看文章。multiprocessin...

weixin_30316287的博客 374

【转】python 进程 multiprocessing模块

python 进程 multiprocessing模块

u010451638的博客 307

python的multiprocessing模块

python自己封装的进程模块,可在各个操作系统下使用(可移植性好) 在这个方法中,所有的事情可以分配给各个子进程去做,父进程专门用于创建子进程和回收子进程 ''' multiprocessing模块创建进程 1.编写子进程执行函数 2.创建进程对象 3.启动进程 4.回收进程 ''' import multiprocessing as mp from time import sleep #全局...

yutaixin的博客 231

python multiprocessing模块_Python multiprocessing模块

一、简介python多线程有个讨厌的限制,全局解释器锁(global interpreter lock),这个锁的意思是任一时间只能有一个线程使用解释器,跟单cpu跑多个程序一个意思,大家都是轮着用的,这叫“并发”,不是“并行”。手册上的解释是为了保证对象模型的正确性!这个锁造成的困扰是如果有一个计算密集型的线程占着cpu,其他的线程都得等着....,试想你的多个线程中有这么一个线程,得多悲剧,多...

weixin_39646084的博客 354
上一篇: Python 多线程之 threading 模块
下一篇: Python 线程池
唐僧不爱八戒
博客等级 码龄9年 158粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值