码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【从零学习python 】85.Python进程池的并行计算技术应用


    文章目录

    • 进程池
        • 运行效果
      • 进程池中的 Queue
        • 运行结果
      • 进阶案例

    进程池

    当需要创建的子进程数量不多时,可以直接利用 multiprocessing 中的 Process 动态生成多个进程,但如果是上百甚至上千个目标,手动创建进程的工作量巨大,此时就可以使用 multiprocessing 模块提供的 Pool 方法。

    初始化 Pool 时,可以指定一个最大进程数,当有新的请求提交到 Pool 中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会用之前的进程来执行新的任务,请看下面的实例:

    from multiprocessing import Pool
    import os, time, random
    
    def worker(msg):
        t_start = time.time()
        print("%s开始执行,进程号为%d" % (msg, os.getpid()))
        # random.random()随机生成0~1之间的浮点数
        time.sleep(random.random()*2)
        t_stop = time.time()
        print(msg, "执行完毕,耗时%0.2f" % (t_stop - t_start))
    
    po = Pool(3)  # 定义一个进程池,最大进程数3
    for i in range(0, 10):
        # Pool().apply_async(要调用的目标, (传递给目标的参数元组,))
        # 每次循环将会用空闲出来的子进程去调用目标
        po.apply_async(worker, (i,))
    
    print("----start----")
    po.close()  # 关闭进程池,关闭后po不再接收新的请求
    po.join()  # 等待po中所有子进程执行完成,必须放在close语句之后
    print("-----end-----")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    运行效果

    ----start----
    0开始执行,进程号为21466
    1开始执行,进程号为21468
    2开始执行,进程号为21467
    0执行完毕,耗时1.01
    3开始执行,进程号为21466
    2执行完毕,耗时1.24
    4开始执行,进程号为21467
    3执行完毕,耗时0.56
    5开始执行,进程号为21466
    1执行完毕,耗时1.68
    6开始执行,进程号为21468
    4执行完毕,耗时0.67
    7开始执行,进程号为21467
    5执行完毕,耗时0.83
    8开始执行,进程号为21466
    6执行完毕,耗时0.75
    9开始执行,进程号为21468
    7执行完毕,耗时1.03
    8执行完毕,耗时1.05
    9执行完毕,耗时1.69
    -----end-----
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    multiprocessing.Pool 常用函数解析:

    • apply_async(func[, args[, kwds]]):使用非阻塞方式调用 func(并行执行,阻塞方式必须等待上一个进程退出才能执行下一个进程),args 为传递给 func 的参数列表,kwds 为传递给 func 的关键字参数列表;
    • close():关闭 Pool,使其不再接受新的任务;
    • terminate():不管任务是否完成,立即终止;
    • join():主进程阻塞,等待子进程的退出,必须在 close 或 terminate 之后使用。

    进程池中的 Queue

    如果要使用 Pool 创建进程,就需要使用 multiprocessing.Manager() 中的 Queue(),而不是 multiprocessing.Queue(),否则会得到一条如下的错误信息:

    RuntimeError: Queue objects should only be shared between processes through inheritance.
    
    • 1

    下面的实例演示了进程池中的进程如何通信:

    # 修改 import 中的 `Queue` 为 `Manager`
    from multiprocessing import Manager, Pool
    import os, time, random
    
    def reader(q):
        print("reader启动(%s),父进程为(%s)" % (os.getpid(), os.getppid()))
        for i in range(q.qsize()):
            print("reader从Queue获取到消息:%s" % q.get(True))
    
    def writer(q):
        print("writer启动(%s),父进程为(%s)" % (os.getpid(), os.getppid()))
        for i in "helloworld":
            q.put(i)
    
    if __name__ == "__main__":
        print("(%s) start" % os.getpid())
        q = Manager().Queue()  # 使用 `Manager` 中的 `Queue`
        po = Pool()
        po.apply_async(writer, (q,))
    
        time.sleep(1)  # 先让上面的任务向 `Queue` 存入数据,然后再让下面的任务开始从中取数据
    
        po.apply_async(reader, (q,))
        po.close()
        po.join()
        print("(%s) End" % os.getpid())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    运行结果

    (4171) start
    writer启动(4173),父进程为(4171)
    reader启动(4174),父进程为(4171)
    reader从Queue获取到消息:h
    reader从Queue获取到消息:e
    reader从Queue获取到消息:l
    reader从Queue获取到消息:l
    reader从Queue获取到消息:o
    reader从Queue获取到消息:w
    reader从Queue获取到消息:o
    reader从Queue获取到消息:r
    reader从Queue获取到消息:l
    reader从Queue获取到消息:d
    (4171) End
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    进阶案例

    【Python】Python 实现猜单词游戏——挑战你的智力和运气!

    【python】Python tkinter库实现重量单位转换器的GUI程序

    【python】使用Selenium获取(2023博客之星)的参赛文章

    【python】使用Selenium和Chrome WebDriver来获取 【腾讯云 Cloud Studio 实战训练营】中的文章信息

    使用腾讯云 Cloud studio 实现调度百度AI实现文字识别

    【玩转Python系列【小白必看】Python多线程爬虫:下载表情包网站的图片

    【玩转Python系列】【小白必看】使用Python爬取双色球历史数据并可视化分析

    【玩转python系列】【小白必看】使用Python爬虫技术获取代理IP并保存到文件中

    【小白必看】Python图片合成示例之使用PIL库实现多张图片按行列合成

    【小白必看】Python爬虫实战之批量下载女神图片并保存到本地

    【小白必看】Python词云生成器详细解析及代码实现

    【小白必看】Python爬取NBA球员数据示例

    【小白必看】使用Python爬取喜马拉雅音频并保存的示例代码

    【小白必看】使用Python批量下载英雄联盟皮肤图片的技术实现

    【小白必看】Python爬虫数据处理与可视化

    【小白必看】轻松获取王者荣耀英雄皮肤图片的Python爬虫程序

    【小白必看】利用Python生成个性化名单Word文档

    【小白必看】Python爬虫实战:获取阴阳师网站图片并自动保存

    小白必看系列之图书管理系统-登录和注册功能示例代码

    小白实战100案例: 完整简单的双色球彩票中奖判断程序,适合小白入门

    使用 geopandas 和 shapely(.shp) 进行地理空间数据处理和可视化

    使用selenium爬取猫眼电影榜单数据

    图像增强算法Retinex原理与实现详解

    爬虫入门指南(8): 编写天气数据爬虫程序,实现可视化分析

    爬虫入门指南(7):使用Selenium和BeautifulSoup爬取豆瓣电影Top250实例讲解【爬虫小白必看】

    爬虫入门指南(6):反爬虫与高级技巧:IP代理、User-Agent伪装、Cookie绕过登录验证及验证码识别工具

    爬虫入门指南(5): 分布式爬虫与并发控制 【提高爬取效率与请求合理性控制的实现方法】

    爬虫入门指南(4): 使用Selenium和API爬取动态网页的最佳方法

    爬虫入门指南(3):Python网络请求及常见反爬虫策略应对方法

    爬虫入门指南(2):如何使用正则表达式进行数据提取和处理

    爬虫入门指南(1):学习爬虫的基础知识和技巧

    深度学习模型在图像识别中的应用:CIFAR-10数据集实践与准确率分析

    Python面向对象编程基础知识和示例代码

    MySQL 数据库操作指南:学习如何使用 Python 进行增删改查操作

    Python文件操作指南:编码、读取、写入和异常处理

    使用Python和Selenium自动化爬取 #【端午特别征文】 探索技术极致,未来因你出“粽” # 的投稿文章

    Python多线程与多进程教程:全面解析、代码案例与优化技巧

    Selenium自动化工具集 - 完整指南和使用教程

    Python网络爬虫基础进阶到实战教程

    Python入门教程:掌握for循环、while循环、字符串操作、文件读写与异常处理等基础知识

    Pandas数据处理与分析教程:从基础到实战

    Python 中常用的数据类型及相关操作详解

    【2023年最新】提高分类模型指标的六大方案详解

    Python编程入门基础及高级技能、Web开发、数据分析和机器学习与人工智能

    用4种回归方法绘制预测结果图表:向量回归、随机森林回归、线性回归、K-最近邻回归

  • 相关阅读:
    智慧社区大屏:连接社区生活的数字桥梁
    智慧养老整体解决方案
    Linux之进程替换
    记录一次坑 | 包版本不一致产生的问题的排查过程
    推荐一个计算Grad-CAM的Python库
    Flask实现Web服务调用Python程序
    分布式文件存储系统minio
    【C++】泛型编程 ③ ( 函数模板 与 普通函数 调用规则 | 类型匹配 | 显式指定函数模板泛型类型 )
    【面试题】Vue 生命周期(二)
    windows terminal 或 cmd 通过SSH远程连接服务器,scp 实现 Windows 与 Linux 文件传输方式
  • 原文地址:https://blog.csdn.net/qq_33681891/article/details/132468559
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号