Python - 多进程使用教程

【Python爬虫系列教程 9-100】爬虫提高速度,发挥多核优势,使用多进程 阅读详情

什么是Multiprocessing?

    大部分计算机cpu都是多核的,为了提高效率,把程序分配到多个核里面同时运行,这就叫多进程。

    Python提供了一个mulitprocessing 库来实现多进程

    (本文是学习“莫烦Python后写的总结,分析与感悟。这里是莫烦python的连接: >点这里< )

1:基本操作:创建进程

    a. 创建一个函数,且不能有返回值

    b. 创建子进程对象,函数名传递给 target,参数放在一个可迭代对象内传递给 args,(注意,若只有一个元素1,且是放在小括号内,则应该写为:args = (1,) 因为加个逗号才算是元组,才可迭代)

    c. 运行子进程(注意!!需要在if __name__ == '__main__':下运行)

'''创建进程'''

import multiprocessing as mp

def job_1(a, b):
    for _ in range(5):
        print("job_1 is running")


if __name__ == '__main__':
    print("main start")
    #创建子进程
    p1 = mp.Process(target=job_1, args=(1, 2))
    #子进程开始运行
    p1.start()
    print("main end")

    这个时候,main相当于主进程,p1是他的子进程,一旦运行到p1.start(),job1才开始运行。而main 和 p1各自运行各自的,并不会相互等待,所以就出现了以下结果:

    

 

2.等待主进程:join()

     join()的官方解释:阻塞当前进程,直到调用join方法的那个进程执行完。

    意思就是:等当前子进程(p1 或 p2) 运行完毕之后,主进程(main)才继续运行。(注意:如果两个子进程都使用join,子进程之间不会互相等待,仍然是各走各的)

    # 只需要把join放在主进程需要等待的地方即可

    准备工作:

import multiprocessing as mp
import time

def run_1():
    for _ in range(5):
        time.sleep(0.1)
        print("job_1 is runing...")

def run_2():
    for _ in range(5):
        time.sleep(0.1)
        print("job_2 is runing...")

if __name__ == '__main__':
    print("main start")
    p1 = mp.Process(target=run_1)
    p2 = mp.Process(target=run_2)

    情况1:main, p1, p2 三个进程互不干扰

    p1.start()
    p2.start()
    print("main end")

       结果:各自运行,非常混乱

                 

       情况2:p1, p2都调用join()

    p1.start()
    p2.start()
    p1.join()
    p2.join()
    print("main end")

     结果:主程序等待p1, p2运行完了之后才运行,但是p1, p2依旧混乱

               

    情况3:p1调用join()之后再调用p2

    p1.start()
    p1.join()
    p2.start()
    print("main end")

    结果有些许奇怪,这是为什么呢?因为p1 调用join之后,main程序在等待p1运行完的时候,根本还没开始运行代码 p2.start() !

"               

 

3.特殊的返回值的方法:Queue

    多进程中,可以利用队列来存储返回值,在进程结束之后再调取存储的返回值

    a.声明一个queue,并把queue作为参数传入方法中

    b.待进程结束后提取 “返回值” 

import multiprocessing as mp
import time

def job_1(q, a, b):
    sum = a * b
    q.put(sum)

def job_2(q, a, b):
    sum = a / b
    q.put(sum)

if __name__ == '__main__':
    q = mp.Queue()
    p1 = mp.Process(target=job_1, args=(q, 1, 2))
    p2 = mp.Process(target=job_2, args=(q, 1, 2))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    print(q.get(), q.get())

 

4.一个池子:pool

    pool也叫做进程池,就是我们将所要运行的东西,放到池子里,Python会自行解决多进程的问题

    用法0:自定义核的数量:pool = mp.Pool(processes = 2) 即pool对象运行时只使用两个核

    用法1:给pool对象一个函数,并传入一个迭代对象(迭代的是传入的参数),pool会返回一个返回值列表

import multiprocessing as mp

def job(a):
    return a*a

if __name__ == '__main__':
    pool = mp.Pool(processes = 2)
    returns = pool.map(job, range(10))
    print(returns)

    

    用法2:apply_async()方法,这个方法类似于直接调用start(),但它接受了一个返回值,而且一个方法只使用一个核。

if __name__ == '__main__':
    pool = mp.Pool()
    returns = pool.apply_async(job, (3,))
    print(returns.get())

 

5.共同处理数据:共享内存

    如果不用共享变量,传入子程序的参数只是一个副本,并不能改变传入的变量的值,也不能相互交流

    所以在多核处理的特殊情况下,我们需要用到共享内存处理、需要子进程之间相互交流数据的情况

    操作1:定义单个共享变量:v = mp.Value('i', 0)

    这里我们呢在两个子程序里面分别对变量加 5 次 2,和 5 次 4 预想的最终结果是 30

import multiprocessing as mp

def run_1(a):
    for _ in range(5):
        a.value = a.value + 2
        print(a.value)

def run_2(a):
    for _ in range(5):
        a.value = a.value + 4
        print(a.value)

if __name__ == '__main__':
    v = mp.Value('i', 0)
    p1 = mp.Process(target=run_1, args=(v,))
    p2 = mp.Process(target=run_2, args=(v,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    print(v.value)

    输出:发现数据实现了共享,且最后也确实被改变成了30。

          2
          8
          10
          12
          14
          6
          18
          22
          26
          30

          30

    操作2:定义变量数组:(注意!!这里只能定义一维数组)

array = mp.Array('i', [1, 2, 3, 4])

    

6.维持秩序:lock

    这里回去第 5 节的输出结果,会发现共享的变量被两个进程抢着用,一会儿加2, 一会儿加4, 一会儿你print,一会儿我print

    有时候我们需要两个程序有顺序的完成各自的任务,不能让他们抢夺变量,这是后就可以用到 进程锁

import multiprocessing as mp


def run_1(a, L):
    #锁住
    L.acquire()
    for _ in range(5):
        a.value = a.value + 2
        print(a.value)
    L.release()
    #释放

def run_2(a, L):
    L.acquire()
    for _ in range(5):
        a.value = a.value + 4
        print(a.value)
    L.release()

if __name__ == '__main__':
    v = mp.Value('i', 0)
    #创建进程索
    L = mp.Lock()
    p1 = mp.Process(target=run_1, args=(v,L))
    p2 = mp.Process(target=run_2, args=(v,L))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    print(v.value)

     这样一来,输出就变得有序起来了:
          2
          4
          6
          8
          10
          14
          18
          22
          26
          30
          30

30 python 多线程与多进程1 介绍了python的多线程和多进程概念,再接受线程模块threading和线程模块_thread的用法 阅读详情

相关推荐

自动驾驶仿真:python和carsim联合仿真案例

carsim内部有许多相关联合仿真的demo,simulink、labview等等都有涉及,这里简单介绍下python和carsim联合仿真的方法,虽然carsim官方有个Steer_Control.py相关的案例,但是感觉比较冗余,这里抽出重点部分和大家交流探讨下。提示:以下是本篇文章正文内容,下面案例可供参考1、这里关于solvers的细节其实都没说,因为里面确实也没什么内容好讲的,本质就是调用carsim.dll,如果你需要更多的函数解析其实可以看vs_api.h,路径在,具体内容如下图所示。

zataji的博客 9061

Python多进程4 进程池——Pool

原文地址 学习来源 是multiprocessing模块下的一个类,是一种创建多进程的更加简便的方式,可以更加方便的分配任务与传递参数。 pool = mp.Pool(processes=6)生成进程池 Pool的两个任务分配的函数 .map(函数名,参数列表的列表)所谓的参数列表的列表是把所有的任务的参数列表再封装到一个列表中,形成一个二维列表。这样Pool就会根据把列表中的参数分配给自己所拥有...

BBJG_001的博客 3574

ADS SerDes仿真实战:深入解析Tx_Diff均衡器(EQ)参数对眼图质量的影响

本文以ADS仿真平台为基础,深入解析了SerDes设计中Tx_Diff均衡器(EQ)参数对信号完整性的核心影响。通过实战演示,详细对比了去加重(De-emphasis)与FIR抽头系数两种调节模式,揭示了它们如何有效对抗信道损耗与码间干扰,从而显著改善眼图的高度、宽度与抖动性能,为高速串行链路设计提供关键调优思路。

weixin_29230901的博客 225

2.5.4.2Python-多进程

总目录:https://www.jianshu.com/p/e406a9bc93a9 Python - 子目录:https://www.jianshu.com/p/50b432cb9460 创建进程 当然从最开始创建一个线程开始 import multiprocessingas mp def job(a,...

寒暄的博客 479

别再手动算K值了!ZEMAX中两种锥透镜建模方法详解(标准面 vs. 轴锥面)

本文详细解析了ZEMAX中锥透镜的两种建模方法:标准面与轴锥面。通过对比两者的精度、计算效率和适用场景,帮助工程师在激光整形、光束匀化等应用中做出最优选择,并提供了参数设置和异常排查的实用技巧。

weixin_42548874的博客 319

【OpenStack】OpenStack原理(一)——OpenStack发展及架构

OpenStack目前的七个核心组件,分别是计算(Compute)、对象存储(Object Storage)、认证(Identity)、用户界面(Dashboard)、块存储(Block Storage)、网络(Network)和镜像服务(Image Service)。

大数据分析BDA 2万+

Python中的并行处理(Pool.map()、Pool.starmap()、Pool.apply()、)

1.并行处理 并行处理是一种在同一台计算机的多个处理器中同时运行任务的工作模式。这种工作模式的目的就是减少总的任务处理时间,但是进程之间的通信会有额外的开销,因此对小的任务而言,总的任务时间会有所增加而不是是减少。 在Python语言中,multiprocessing模块通过使用子进程(而不是线程)来运行独立的并行进程。它可以让您利用机器上的多个处理器(Windows和Unix),也就是说,多个进程可以完全独立的在内存中运行 2.自己的设备最多可以进行多少个并行处理 ......

Mogul的博客 3万+

Maven

是一款自动化构建工具,专注于Java项目的构建、依赖的管理。

weixin_58738870的博客 2163

Python 多进程 mp.Pool 多线程 ThreadPoolExecutor 优缺点

相反,如果你的任务主要是IO密集型的,那么多线程可能更加合适。避免全局解释器锁(GIL):Python中的GIL限制了同一个时刻只有一个线程可以执行Python字节码,而多进程由于每个进程都有自己的Python解释器和内存空间,因此可以真正并行地执行多个任务。开销较大:创建进程比创建线程需要更多的时间和资源,尤其是在任务数量很大或者任务执行时间很短时,进程的创建和销毁会带来相对较大的开销。适合CPU密集型任务:在多核CPU上,当任务主要受CPU性能限制时,使用多进程可以显著提高程序的执行速度。

大树叶 技术专栏 1097

我用GPT-5.5十分钟就搞定了论文创新点!全靠这三个提示词

各位同仁好,我是七哥。一个在高校里从事人工智能 相关领域研究,钻研用大模型AI实操的学术人。可以和七哥交流学术写作或Gemini、GPT、Claude 等大模型 学术实操相关问题,多多交流,相互成就,共同进步。多数研究者一写创新点就总觉得只有提出了全新的理论、颠覆了整个领域,才算真正的创新。但学术研究里的创新,有一半不是从零创造的,是在前人工作的基础上,准确找到还没人解决、或者没解决好的问题,而且真正能立住的创新通常都离不开以下这三个问题。第一,前人到底缺了什么。

智能AI让学术科研更容易 707

基于SOLIDWORKS API的工业级插件开发指南

SOLIDWORKS API是基于COM技术的一套开发接口,支持C#、VB.NET等语言,用于自动化建模、属性管理、界面定制等功能。

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 2745

Python 多进程Multiprocessing

文章目录多进程 Multiprocessing添加进程 Process存储进程输出 Queue效率对比 threading &amp; multiprocessing进程池 Pool共享内存 shared memory进程锁 Lock 多进程 Multiprocessing 添加进程 Process import multiprocessing as mp #import threading as td # 定义一个被线程和进程调用的函数 def job(a,d): print('aaaaa')

Disany的博客 384

课堂练习及课后作业2.1:外部中断

本关任务:通过相关知识以及实验回答:版本 1 内核的第 6 次时钟中断发生时,断点和恢复点(指令地址)分别是多少?本关任务:修改版本 0 内核,使得每发生 100 次时钟中断,就在屏幕上输出一个字符‘t’和当时的进程号,如“t(0)”表示0号进程运行时发生了时钟中断。本关任务:通过实际操作回答在输出第一行 0/1 字符的过程中(如下图所示),共发生了几次时钟中断?本关任务:修改版本 1 内核源码,使得每次时钟中断发生时,都在屏幕上输出字符‘t’。分析版本1内核,找到第一次时钟中断的恢复点地址。

Junds0的博客 1万+

Python multiprocessing多进程模块使用教程

进程是操作系统资源分配的基本单位,每个进程都有独立的内存空间、数据栈等。与线程不同,进程间的内存不共享。由于GIL(全局解释器锁)的存在,Python的多线程在CPU密集型任务上无法充分利用多核优势。multiprocessing模块通过创建子进程绕过GIL限制,实现真正的并行计算。 2.2 带参数的进程 2.3 继承Process类 3. 进程间通信 3.1 队列(Queue) 3.2 管道(Pipe) 3.3 共享内存 3.3.1 Value和Array 3.3.2 共享内存管理器 4. 进

qq_17275369的博客 1622

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Python 多线程+多进程简单使用教程,如何在多进程开多线程

一、Python多进程多线程 关于python多进程多线程的相关基础知识,在我之前的博客有写过,并且就关于python多线程的GIL锁问题,也在我的一篇博客中有相关的解释。 为什么python多线程在面对IO密集型任务的时候会产生加速作用? 为什么python多线程在面对CPU计算密集型任务的时候不仅起不到加速作用,反而加长了计算时间? 相关传送门: 进程,线程,协程关系:https://blog.csdn.net/qq_35869630/article/details/105747155 python线程

qq_35869630的博客 5897

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Python 多线程、多进程的详细使用教程

在现代计算机中,使用多线程和多进程可以充分利用多核处理器的优势,提高程序的性能和响应能力。Python作为一门简洁而强大的编程语言,提供了丰富的多线程和多进程管理工具。本教程将详细介绍Python中多线程和多进程的使用方法,帮助读者充分发挥计算机的计算能力。

Rocky006的博客 530

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

python使用zeromq实现多进程简单poll复用

参考:https://learning-0mq-with-pyzmq.readthedocs.io/en/latest/pyzmq/multisocket/zmqpoller.html 实现zmqpolling.py.py import zmq import time import sys import random from multiprocessing import Process ...

xzh2005227042的专栏 1552

Python 上的多线程和多进程使用

Python 上的多线程和多进程使用 一、进程和线程 进程是操作系统进行资源分配的最小单元,资源包括CPU、内存、磁盘等IO设备等等,而线程是CPU调度的基本单位。举个简单的例子来帮助理解:我们电脑上同时运行的浏览器和视频播放器是两个不同的进程,进程可能包含多个子任务,这些子任务就是线程,比如视频播放器在播放视频时要同时显示图像、播放声音、显示字幕,这就是三个线程。 1、多线程 操作系统通过给不同...

藏晖的博客 541

python 多进程 + 队列 检查代理ip有效性

之前写过获取代理IP和检查代理IP有效性的 脚本 。其中检查代理IP的效率太低,不能达到工作的要求,所以这次用多进程重写了一下。不太了解多进程的,请先参考liaoxuefeng的文章。 一、准备: # 加载模块 import multiprocessing as mp import time import requests ips_ok_file = r'd:/tmp/xici_ips.t...

uvyoaa的专栏 1372

多进程日志处理库 multiprocessing-logging 安装与使用教程

多进程日志处理库 multiprocessing-logging 安装与使用教程 项目概述 multiprocessing-logging 是一个专为解决在使用 Python 的 multiprocessing 模块时遇到的日志记录问题而设计的开源库。它确保了在多进程环境下,各个子进程能够正确并独立地将日志记录到指定的目标,避免日志记录冲突或混乱。 1. 项目目录结构及介绍 由于提供的是GitHu...

gitblog_01149的博客 533

Multiprocessing 学会多进程 (莫烦 Python 教程)笔记-1-添加线程 add thread

Multiprocessing 学会多进程 (莫烦 Python 教程)笔记-1-添加线程 add thread 本教程来自周莫烦老师的b站多线程教学视频 调用多核使用的库 import multiprocessing as mp 创建多核 import multiprocessing as mp def job(a,d): print('aaaaaa') if __name__ == '__main__': p1 = mp.Process(target=job,args=(1

weixin_41281151的博客 220

多进程爬虫示例 - 中级 Python 编程 p.12

这段文字介绍了如何使用 Python 的 multiprocessing 和 Beautiful Soup 库进行网页解析的多进程处理,以提高效率。 主要内容如下: 介绍: 文章以 Beautiful Soup 库为例,说明了多进程处理在网页解析中的优势。 准备工作: 文章建议安装 Beautiful Soup 和 LXML 库,并提供了一些 Beautiful Soup 的基础教程链接。 ...

sentdex的博客 188

Multiprocessing 学会多进程 (莫烦 Python 教程)笔记-2-queue进程输出

Multiprocessing 学会多进程 (莫烦 Python 教程)笔记-2-queue进程输出 本教程来自周莫烦老师的b站多线程教学视频 import multiprocessing as mp def job(q): res = 0 print('aaaaaa') for i in range(1000): res += i+i**2+i**3 q.put(res) #queue if __name__ == '__main__':

weixin_41281151的博客 199

Python开发多进程、多线程以及协程是什么?项目是否用?

项目是否用?其实多,多进程,在实际开发中用到的很少,进程:一个运行的程序(代码)就是一个进程,没有运行的代码叫程序;线程:调度执行的最小单位,也叫执行路径;协程:是一种用户态的轻量级线程,协程的调度完全由用户控制。

yy1715713348的博客 174

python多进程的使用

本文是为初学者设计的Python多进程编程全攻略,涵盖基础概念、核心函数详解、系统特性分析,并附带流程图、测试用例、开源项目推荐和经典书籍清单。通过8个实战代码示例和3个性能对比实验,帮你避开常见陷阱,快速掌握进程级并行计算。

m0_54069809的博客 1062

Python 多进程和多线程 的使用

1. Python 多进程 创建使用 2. 进程的编号 id 3. Process name 参数(进程名) 4. 多进程的参数 args 和 kwargs 5. 进程之间不共享全局变量 6. 守护进程 7. 多线程 7.1 线程 介绍 7.2 多线程 实现方式 8. 线程的无序执行 9. 守护线程 10. 线程之间 共享全局变量 11. 线程共享全局变量 出现的问题 12. 线程同步 13. 互斥锁 14. 解释一下互斥锁产生的 死锁问题

探索技术与实践的旅程,分享编程经验与工具使用心得,助力开发者提升技能。 1396
上一篇: 01背包,完全背包,多重背包,混合背包详解
下一篇: STL - stack用法总结
Korpse
博客等级 码龄9年 115粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值