Python3,如何实现CPU的并行计算,那还不简单,5种方式,这篇就搞定。

2023-11-12

1、引言

小屌丝:鱼哥,你上一篇《Python3,掌握这几种并行处理,轻轻松松提升for循环速度》写的很赞, 我还想继续深入并行计算。
小鱼:那你的意思,哪一篇写的不深呗?
小屌丝:我可没有那个意思。
小鱼:我也没说你是哪个意思。
小屌丝:我就是想着你能不能再讲一讲,关于如何实现CPU并行计算。
小鱼:我屮艸芔茻…你这是有啥心思?
小屌丝:我… 我没有。
在这里插入图片描述

小鱼:如实说来,或许,我还能讲一讲。
小屌丝:当真?
小鱼:当真…
小屌丝:就是,我要在公司分享一些技术,就涉及到 如何实现CPU并行计算方面的姿势 . 知识。
小鱼:这样啊, 那你直接说就好了。 我又不是特别喜欢黑桃A。
小屌丝:… 整,整,整吧。

2、实战

2.1 多进程模式

这里,我们主要以Python中的额多进程模式进行讲解。

2.1.1 定义

  • 在Python中,多进程模式是指同时运行多个进程来执行任务的一种编程模式。
  • Python提供了多个模块来支持多进程编程,其中最常用的是multiprocessing模块。

2.1.2 multiprocessing

  • 使用multiprocessing模块可以创建和管理多个进程,每个进程都有自己独立的内存空间和执行环境。
  • 通过将任务分配给不同的进程,可以实现并行执行,提高程序的运行效率。

2.1.3 模式

  • 在多进程模式下,每个进程都有自己的主程序流程,可以独立执行任务。
  • 进程之间可以通过进程间通信(IPC)机制来进行数据交换和同步操作。

2.1.4 适用场景

  • 多进程模式适用于需要充分利用多核处理器或执行耗时任务的场景。
  • 通过将任务分配给多个进程,可以充分利用系统资源,提高程序的运行效率。

2.1.4 代码示例

代码示例

# -*- coding:utf-8 -*-
# @Time   : 2023-07-01
# @Author : Carl_DJ


import multiprocessing

def worker(num):
    """子进程的任务函数"""
    print(f'Worker {num} started')
    # 执行一些任务
    print(f'Worker {num} finished')

if __name__ == '__main__':
    # 创建多个子进程
    processes = []
    for i in range(5):
        p = multiprocessing.Process(target=worker, args=(i,))
        processes.append(p)
        p.start()

    # 等待所有子进程结束
    for p in processes:
        p.join()

    print('All workers finished')

2.2 执行方法

2.2.1 多线程并发执行

多进程模式下,将任务分配给多个进程并行执行,从而利用多核CPU的优势。
这可以说作为一名码农,必备的知识点。

这里,我们同样使用multiprocessing 来实现一个并发执行任务的示例。

代码示例

# -*- coding:utf-8 -*-
# @Time   : 2023-07-01
# @Author : Carl_DJ

import multiprocessing

def task(name):
    print(f"Running task {name}")

if __name__ == "__main__":
    # 创建进程池,最大进程数为4
    pool = multiprocessing.Pool(processes=4)

    # 提交任务到进程池
    for i in range(10):
        pool.apply_async(task, args=(i,))

    # 关闭进程池,不再接受新的任务
    pool.close()

    # 等待所有任务完成
    pool.join()

    print("All tasks completed")

解析:

  • 首先创建了一个进程池,最大进程数为4;
  • 其次使用apply_async方法提交了10个任务到进程池中;
  • 最后,我们关闭进程池并等待所有任务完成。

2.2.2 进程池

对于大量重复的任务,
使用进程池来维护一定数量的进程,每个进程执行一个任务后返回结果,然后再由进程池分配下一个任务。
这样的好处就是:避免频繁地创建和销毁进程,从而提高效率

我们使用 multiprocessing模块的Pool类来实现进程池。

代码示例

# -*- coding:utf-8 -*-
# @Time   : 2023-07-01
# @Author : Carl_DJ

import multiprocessing

def worker(num):
    print('Worker', num)

if __name__ == '__main__':
    # 创建一个进程池,最大进程数为3
    pool = multiprocessing.Pool(processes=3)

    # 使用进程池执行任务
    for i in range(5):
        pool.apply_async(worker, (i,))

    # 关闭进程池,不再接受新的任务
    pool.close()

    # 等待所有任务完成
    pool.join()

解析

  • 首先,创建了一个进程池,最大进程数为3;
  • 其次,使用进程池的apply_async方法提交任务,每个任务都会由进程池中的一个空闲进程执行;
  • 最后,关闭进程池并等待所有任务完成。

2.2.3 消息队列

在多进程模式下,不同的进程之间需要进行通信,可以利用消息队列来实现进程间通信。

我们使用Queue模块来实现消息队列。

代码示例

# -*- coding:utf-8 -*-
# @Time   : 2023-07-01
# @Author : Carl_DJ

from queue import Queue
import time

# 创建一个消息队列
message_queue = Queue()

# 生产者函数,向消息队列中添加消息
def producer():
    for i in range(5):
        message = f"Message {i+1}"
        message_queue.put(message)
        print(f"Produced: {message}")
        time.sleep(1)

# 消费者函数,从消息队列中获取消息并处理
def consumer():
    while True:
        message = message_queue.get()
        print(f"Consumed: {message}")
        time.sleep(2)
        message_queue.task_done()

# 创建并启动生产者和消费者线程
producer_thread = threading.Thread(target=producer)
consumer_thread = threading.Thread(target=consumer)

producer_thread.start()
consumer_thread.start()

# 等待生产者和消费者线程结束
producer_thread.join()
consumer_thread.join()

解析

  • 使用Queue模块创建了一个消息队列message_queue
  • 生产者函数producer负责向消息队列中添加消息;
  • 消费者函数consumer负责从消息队列中获取消息并进行处理。

2.2.4 内存共享

对于需要多个进程共享的数据,可以使用共享内存来避免数据拷贝和进程间通信的开销。

我们使用multiprocessing模块的Value和Array类来实现共享内存

代码示例

# -*- coding:utf-8 -*-
# @Time   : 2023-07-01
# @Author : Carl_DJ

from multiprocessing import Process, Value, Array

# 定义一个共享变量
shared_value = Value('i', 0)

# 定义一个共享数组
shared_array = Array('d', [0.0, 1.0, 2.0, 3.0, 4.0])

# 定义一个函数,用于修改共享变量和数组的值
def modify_shared_data(value, array):
    value.value = 10
    for i in range(len(array)):
        array[i] = i * 2

# 创建一个子进程,传入共享变量和数组
p = Process(target=modify_shared_data, args=(shared_value, shared_array))
p.start()
p.join()

# 打印共享变量和数组的值
print("Shared value:", shared_value.value)
print("Shared array:", shared_array[:])

解析

  • 首先,使用Value和Array类分别创建了一个共享变量shared_value和一个共享数组shared_array;
  • 其次,定义了一个函数modify_shared_data,该函数会修改共享变量和数组的值;
  • 第三,创建了一个子进程,将共享变量和数组作为参数传递给子进程;
  • 最后,子进程执行完毕后,输出共享变量和数组的值。

2.2.5 异步IO

对于I/O密集型任务,可以使用异步IO来提高效率。

我们使用asyncio模块来实现异步IO

代码示例

# -*- coding:utf-8 -*-
# @Time   : 2023-07-01
# @Author : Carl_DJ


import asyncio

async def fetch_data(url):
    print(f"正在请求URL:{url}")
    await asyncio.sleep(2)  # 模拟网络请求延迟
    print(f"请求URL:{url}完成")
    return f"从{url}获取的数据"

async def main():
    urls = [
        "https://www.example.com",
        "https://www.google.com",
        "https://www.baidu.com"
    ]
    tasks = [fetch_data(url) for url in urls]
    results = await asyncio.gather(*tasks)
    print(results)

if __name__ == "__main__":
    asyncio.run(main())

解析

  • 首先,定义一个fetch_data函数,模拟了一个网络请求,并使用asyncio.sleep来模拟请求的延迟;
  • 其次,在main函数中,创建了多个fetch_data的协程任务,并使用asyncio.gather来并发执行这些任务;
  • 最后,使用asyncio.run来运行main函数。

3、总结

看到这里,今天的分享差不多就到这里了。
今天主要针对在Python中, 使用多进程模式来实现CPU的并行计算。如:

  • 多线程并发执行
  • 进程池
  • 消息队列
  • 内存共享
  • 异步IO

在实际的项目中,很多地方都会用到并行计算, 这不仅提高的代码执行效率, 也提高了用户的满意度。

我是小鱼

  • CSDN 博客专家
  • 阿里云 专家博主
  • 51CTO博客专家
  • 51认证讲师等
  • 认证金牌面试官
  • 职场面试及培训规划师
  • 多个国内主流技术社区的认证专家博主
  • 多款主流产品(阿里云等)测评一、二等奖获得者

关注我,带你学习更多更专业更前言的Python技术。

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

Python3,如何实现CPU的并行计算,那还不简单,5种方式,这篇就搞定。 的相关文章

随机推荐

  • computed和watch的区别?(Vue面试题)

    有两种答法 大家自行参考 也可以结合起来 第一种 conputed 能完成的功能 watch 都可以完成 watch 能完成的功能 computed 不一定能完成 例如 watch 可以进行异步操作 两个重要的小原则 所有被 Vue 管理的
  • 用Java实现扑克牌游戏——简易炸金花

    一 思想呈现 首先 我们需要创建扑克牌 用字符串型定义扑克牌的花色 用整数型定义扑克牌上的数字 便于扑克牌的保存 再通过构造方法产生对应的对象 对外提供getter和setter方法便于使用 然后重写方法 使结果返回对应的花色与数字 接着来
  • 谷歌翻译网址

    个人总结的几个谷歌工具直连地址 http translate google cn hl zh CN http translate google cn http translate google cn hl cn
  • k8s集群nfs网络持久卷存储实现

    1 nfs介绍和作用 nfs卷能将 NFS 网络文件系统 挂载到Pod 中 不像 emptyDir 那样会在删除 Pod 的同时也会被删除 nfs卷的内容在删除 Pod 时会被保存 卷只是被卸载 2 pv和pvc介绍 pv持久卷是集群中的一
  • C语言学习笔记(二)————数据类型相关,单双引号区别

    1 c语言中的数据类型及输出 常用的几种数据类型 输出格式 int 整型 占用4字节 d 打印整型 short 短整型 占用2字节 hd 打印short类型 d也可以 long 长整型 Windows为4字节 也可以理解32位编译器中占4字
  • cookie实现记住密码

    一 什么是Cookie cookie是一种WEB服务器通过浏览器在访问者的硬盘上存储信息的手段 Cookie的目的就是为用户带来方便 为网站带来增值 虽然有着许多误传 事实上Cookie并不会造成严重的安全威胁 Cookie永远不会以任何方
  • 舆情&传染病时空分析文献阅读笔记

    1 朱炤瑗 秦昆 关庆锋 罗萍 姚博睿 漆林 周扬 COVID 19期间国家关系交互网络时空分析研究 J 地理与地理信息科学 2022 38 01 15 22 研究问题 COVID 19疫情不断蔓延为国际政治 外交关系等带来深刻影响 目前基
  • React-学习笔记(4-组件生命周期)

    1 旧 的生命周期函数 9个 初始化时调用的生命周期函数 初始化由 ReactDOM render 引发 constructor 就是类的构造器 最早执行的 一生只执行一次 UNSAFE componentWillMount 将要挂载 一生
  • Python爬虫入门 Urllib库的基本使用

    1 分分钟扒一个网页下来 怎样扒网页呢 其实就是根据URL来获取它的网页信息 虽然我们在浏览器中看到的是一幅幅优美的画面 但是其实是由浏览器解释才呈现出来的 实质它是一段HTML代码 加 JS CSS 如果把网页比作一个人 那么HTML便是
  • Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile

    程序报错 Failed to execute goal org apache maven plugins maven compiler plugin 2 3 2 compile 原因是缺少maven compiler plugin插件 在p
  • 【C语言】小白学浮点数

    一 浮点数的概念 浮点数也称小数或实数 C语言中采用 float 和 double 关键字来定义小数 float称为单精度浮点型 double称为双精度浮点型 另外 部分编译器支持更大精度的long double 但不是所有的编译器都支持
  • 你好请问,postman不登录联网怎么使用mock Server

    你好 Postman 具有内置的 mock server 功能 因此无需联网即可使用 要使用 mock server 请执行以下步骤 打开 Postman 应用程序 创建一个新的请求 或打开一个现有的请求 在请求的右上角 单击 更多 按钮
  • pyqt窗口控件跟随窗口大小变化而变化的方法

    要做的很简单 使用qtdesigner对设计的界面配置一下layout 页面布局 即可实现拖拽时界面中控件的放大缩小 这是布局时的几种方式 重点 用designer时要注意 不要选中多个控件然后右键选择layout 要直接在mainwind
  • 恶意代码分析实战07-02

    先peview看看exe程序 注意到这里有两个kernel32 dll 不过仔细看的话 发现其中有一个是假的 名字为kerne132 dll kernel的l被换成了1 而且出现了lab07 03 dll 看来运行这个exe的时候会加载这个
  • 常见JMeter面试题

    1 什么是JMeter JMeter是一种开源的性能测试工具 可以用于测试静态和动态资源 如Web应用程序 数据库 FTP服务器等 2 JMeter可以测试哪些类型的应用 JMeter可以测试各种类型的应用程序 包括Web应用程序 数据库服
  • Python中[:2]、[:,-1]、[-1]、[:-1]、[::-1]、[2::-1]如何使用

    数据准备 import numpy as np X np array 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 print X 形成矩阵 1 print X 1 取最后一个元素 2
  • C++检测异常assert()函数

    1 assert 函数使用 assert 一般用于debug下异常检测的功能函数 例如文件打开是否成功 函数形参传入是否理想 变量定义是否正确等 总的来说其作用是如果它的条件返回错误 则终止程序执行 原型定义 include
  • 如何用PHP写一个excel文件并导出

    其实用PHP写一个excel文件并下载下来很容易 这里我们使用了PHPExcel库去实现一个例子
  • Java基础篇--工具类操作之敏感词过滤

    编写敏感词过滤程序 说明 在网络程序中 如聊天室 聊天软件等 经常需要对一些用户所提交的聊天内容中的敏感性词语进行过滤 如 性 色情 爆炸 恐怖 枪 军火 等 这些都不可以在网上进行传播 需要过滤掉或者用其他词语替换掉 提示 将用户的聊天内
  • Python3,如何实现CPU的并行计算,那还不简单,5种方式,这篇就搞定。

    多进程实现CPU并行计算 1 引言 2 实战 2 1 多进程模式 2 1 1 定义 2 1 2 multiprocessing 2 1 3 模式 2 1 4 适用场景 2 1 4 代码示例 2 2 执行方法 2 2 1 多线程并发执行 2