python多进程教学-超多模版例子代码

2023-05-16

文章目录

  • Python 多进程教程
    • 什么是多进程?
    • multiprocessing模块的基本用法
    • 进程池
  • 多进程例子
    • 例子1:计算密集型任务
    • 例子2:IO密集型任务
    • 例子3:共享内存
  • 进程池例子
    • 例子1:爬虫程序
    • 例子2:图片处理程序
    • 例子3:并行计算程序

Python 多进程教程

Python提供了许多多进程处理模块,可以帮助我们实现并行计算,提高程序的运行效率。在本教程中,我们将介绍Python的多进程处理模块multiprocessing的基本用法。

什么是多进程?

进程是操作系统中运行的程序的实例,每个进程都有自己独立的内存空间和系统资源。多进程指的是同时运行多个进程,每个进程都可以独立执行任务。与多线程不同,多进程可以利用多个CPU核心进行并行计算,从而更快地完成任务。

multiprocessing模块的基本用法

multiprocessing模块提供了一个Process类,可以用来创建进程。我们可以通过继承Process类来定义自己的进程类。下面是一个简单的例子:

from multiprocessing import Process

class MyProcess(Process):
    def __init__(self, name):
        super().__init__()
        self.name = name

    def run(self):
        print(f"Hello, {self.name}!")

if __name__ == '__main__':
    p = MyProcess("World")
    p.start()
    p.join()

在这个例子中,我们定义了一个MyProcess类,它继承自Process类,并重写了run()方法。在run()方法中,我们打印出了"Hello, World!"。

在主程序中,我们首先创建了一个MyProcess实例p,然后调用了p.start()方法来启动进程。最后调用p.join()方法等待进程完成。需要注意的是,在Windows系统中,必须在if name == 'main’语句块中创建和启动进程,否则会出现错误。

进程池

在实际应用中,我们通常需要创建多个进程来并行处理任务。如果每次都创建一个新的进程,会消耗大量的系统资源,而且也会影响程序的性能。为了解决这个问题,Python提供了进程池的概念。进程池可以预先创建多个进程,然后将任务分配给这些进程,从而减少了进程的创建和销毁时间,提高了程序的运行效率。

在Python中,我们可以使用multiprocessing模块中的Pool类来创建进程池。下面是一个简单的例子:

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    with Pool(5) as p:
        print(p.map(f, [1, 2, 3, 4, 5]))

在这个例子中,我们首先定义了一个函数f(x),它返回x的平方。然后我们创建了一个进程池,其中包含5个进程。我们调用p.map(f, [1, 2, 3, 4, 5])方法,将任务分配给进程池中的进程进行并行计

多进程例子

例子1:计算密集型任务

在计算密集型任务中,程序需要进行大量的计算,例如求解复杂的数学问题、加密/解密数据等。由于计算量很大,使用单进程可能会导致程序运行缓慢。我们可以使用多进程来加速计算过程。

import time
import multiprocessing

def calculate(number):
    result = 0
    for i in range(number):
        result += i
    return result

if __name__ == '__main__':
    start_time = time.time()
    with multiprocessing.Pool() as pool:
        results = pool.map(calculate, [50000000, 50000000, 50000000])
    end_time = time.time()
    print(f'Total time: {end_time - start_time:.2f} seconds')
    print(f'Results: {results}')

在这个例子中,我们定义了一个calculate函数,它接受一个数字作为参数,然后使用一个for循环计算从0到该数字的和。我们使用multiprocessing.Pool()创建一个进程池,然后使用pool.map()方法将计算任务分配给进程池中的进程进行并行计算。最后我们将计算结果打印出来。

例子2:IO密集型任务

在IO密集型任务中,程序需要进行大量的IO操作,例如读写文件、网络通信等。由于IO操作通常比计算操作更慢,使用单进程可能会导致程序运行缓慢。我们可以使用多进程来充分利用系统资源,提高程序的运行效率。

import time
import multiprocessing

def download(url):
    print(f'Starting download: {url}')
    time.sleep(2)
    print(f'Finished download: {url}')

if __name__ == '__main__':
    urls = ['https://www.python.org/', 'https://www.google.com/', 'https://www.github.com/']
    start_time = time.time()
    with multiprocessing.Pool() as pool:
        pool.map(download, urls)
    end_time = time.time()
    print(f'Total time: {end_time - start_time:.2f} seconds')

在这个例子中,我们定义了一个download函数,它接受一个URL作为参数,然后模拟下载操作。我们使用multiprocessing.Pool()创建一个进程池,然后使用pool.map()方法将下载任务分配给进程池中的进程进行并行下载。最后我们将下载的总时间打印出来。

例子3:共享内存

在多进程编程中,每个进程都有自己独立的内存空间,无法直接访问其他进程的内存。如果多个进程需要共享数据,可以使用共享内存的方式。共享内存允许多个进程访问同一块内存空间,从而实现数据共享。

import multiprocessing

def increment(counter):
    for i in range(100000):
        counter.value += 1

if __name__ == '__main__':
    counter = multiprocessing.Value('i', 0)
    processes = []

进程池例子

例子1:爬虫程序

在爬虫程序中,我们需要从多个网站中抓取数据。由于每个网站的响应时间可能不同,因此使用单进程进行抓取可能会导致程序运行缓慢。我们可以使用进程池来并行抓取数据。

import multiprocessing
import requests

def download(url):
    response = requests.get(url)
    return response.text

if __name__ == '__main__':
    urls = ['https://www.python.org/', 'https://www.google.com/', 'https://www.github.com/']
    with multiprocessing.Pool() as pool:
        results = pool.map(download, urls)
    for result in results:
        print(result[:50])

在这个例子中,我们定义了一个download函数,它接受一个URL作为参数,然后使用requests模块抓取网页内容。我们使用multiprocessing.Pool()创建一个进程池,然后使用pool.map()方法将抓取任务分配给进程池中的进程进行并行抓取。最后我们将抓取的结果打印出来。

例子2:图片处理程序

在图片处理程序中,我们需要对多个图片进行处理。由于处理每个图片可能需要较长时间,因此使用单进程进行处理可能会导致程序运行缓慢。我们可以使用进程池来并行处理图片。

import multiprocessing
from PIL import Image

def process_image(filename):
    with Image.open(filename) as image:
        image = image.rotate(90)
        image = image.resize((500, 500))
        image.save(f'processed_{filename}')

if __name__ == '__main__':
    filenames = ['image1.jpg', 'image2.jpg', 'image3.jpg']
    with multiprocessing.Pool() as pool:
        pool.map(process_image, filenames)

在这个例子中,我们定义了一个process_image函数,它接受一个文件名作为参数,然后使用PIL模块进行图片处理。我们使用multiprocessing.Pool()创建一个进程池,然后使用pool.map()方法将处理任务分配给进程池中的进程进行并行处理。

例子3:并行计算程序

在并行计算程序中,我们需要对大量的数据进行计算。由于计算量很大,使用单进程进行计算可能会导致程序运行缓慢。我们可以使用进程池来并行计算数据。

import multiprocessing

def calculate(number):
    result = 0
    for i in range(number):
        result += i
    return result

if __name__ == '__main__':
    numbers = [10000000, 20000000, 30000000]
    with multiprocessing.Pool() as pool:
        results = pool.map(calculate, numbers)
    print(f'Results: {results}')

在这个例子中,我们定义了一个calculate函数,它接受一个数字作为参数,然后使用一个for循环计算从0到该数字的和。我们使用multiprocessing.Pool()创建一个进程池,然后使用pool.map()方法将计算任务分配给进程池中的进程进行并行计

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

python多进程教学-超多模版例子代码 的相关文章

  • android webApp 调试问题解决

    前不久做了个webapp xff0c 在pc上chrome调试都是可以的 但是手机上显示却有点问题 xff0c 所以一直是想在手机浏览器上调试 xff0c 但是一直没有相关支持 xff0c 后来google终于出了chrome beta版
  • android系统源代码分析 书评

    其实接触android应用开发差不多两年了 xff0c 但是实际上并没与多少拿得出手的作品 因为在很长一段时间里我都在问自己android是什么 xff0c 内部怎么运行的 xff0c 为什么我的java代码就可以在linux上运行 xff
  • Fedora18博通430g电信无线拨号上网

    回家折腾了有两三天 xff0c 想让fedora18 也能蹭上网 首当其冲的问题就是fedora 没有为无线网卡安装驱动 xff0c 只能自己慢慢找驱动 费了好久找到上传了驱动下载 xff0c 满心欢喜按照README 编译 xff0c 结
  • VR技术的发展趋势,未来有哪些展望?

    虚拟现实技术Virtual Reality xff0c 缩写为VR xff0c 是一项全新的实用技术 虚拟现实技术包含计算机 电子信息 仿真技术于一体 xff0c 其基本实现方式是计算机模拟虚拟环境从而给人以环境沉浸感 目前来看 xff0c
  • APM2.8 Rover 自动巡航车设计(超声波和红外测距仪的安装和设置)

    xff08 转载 xff09 4 1 ROVER自动巡航车自主壁障的设置 APM2 8的飞控驾驶仪的传感器接入支持超声波 xff0c 电压传感器 xff0c 电流传感器 xff0c 光流传感器 xff0c 红外传感器 其中超声波和红外传感器
  • 学习笔记(一)-古月ROS机器视觉开发入门 -摄像头参数标定

    我们做图像处理为的就是要得到图像的数据 xff0c 在得到这些数据之后怎么对这些数据进行处理 xff0c 这才是我们主要关心的问题 但是 xff0c 在此之前 xff0c 我们还需要做一个非常主要的步骤 对摄像头的参数进行参数标定 安装标定
  • 卸载ROS的方法

    1 卸载全部ros span class token variable sudo span span class token variable apt get span span class token variable remove sp
  • Json String to Java Bean

    34 version 34 1 34 consentId 34 34 b618924f 8a6c 42bc 8553 99e3a8a0fec4 34 34 domain 34 34 cd site15294072534021 com 34
  • 实战PyQt5: 097-键盘事件

    在一个GUI桌面应用中 xff0c 用户和程序之间的交互一般通过键盘和鼠标来完成 xff0c 处理有关键盘和鼠标的事件是一个GUI程序几乎不可或缺的部分 xff0c 下面介绍在Qt中处理输入焦点和键盘事件的相关知识 设置控件的输入焦点 在一
  • 线性代数之——特征值和特征向量

    线性方程 A x 61 b Ax 61 b A x 61 b 是稳定状态的问题 xff0c 特征值在动态问题中有着巨大的重要性
  • Px4源码框架结构图

    此篇blog的目的是对px4工程有一个整体认识 xff0c 对各个信号的流向有个了解 xff0c 以及控制算法采用的控制框架 PX4自动驾驶仪软件 可分为三大部分 xff1a 实时操作系统 中间件和飞行控制栈 1 NuttX实时操作系统 提
  • aruco marker 的使用

    安装aruco 教程 xff1a make make install
  • PX4自定义Mavlink消息(一)px4发送

    用于项目需求 xff0c 需要在PX4和QGC新增自定义消息用于通信控制 xff0c 看了很多有关文章 xff0c 我就不明白 xff0c 为啥代码都是复制来复制去的 xff0c 大部分的文章连变量名的起的一样 一点帮助都没有 xff0c
  • QGC接收PX4自定义Mavlink消息(二)qgc接收

    这里补充一些 xff0c 我的px4版本是1 11 0dev xff0c 在ubuntu18 04上开发 xff0c qgc为目前官网最新的版本 xff0c 在windows上上开发 xff0c 大家的源码会因为版本差异而有少许区别 xff
  • OpenWRT无线配置

    默认开启无线网络 修改 xff08 package kernel mac80211 files lib wifi mac80211 sh xff09 vi span class hljs built in package span kern
  • cmake自动添加所有源文件和头文件

    cmake自动添加源文件和头文件 一 背景 项目中需要不断新建源文件和头文件 xff0c 每添加一个文件CMakeLists txt中需要手动加入源文件和指定头文件路径 xff0c 不胜其烦 突发奇想cmake能不能像IDE一样 xff0c
  • github在线修改文章

    github在线添加文件夹 输入文件名字后 xff0c 再输入英文模式下的 即可 修改fork后自己的 xff0c 直接提交 Github 网页上 更新 Fork别人的 Repository https blog csdn net huut
  • GPS 0183协议GGA、GLL、GSA、GSV、RMC、VTG解释 + 数据解析

    每个时区跨15 经度 以0 经线为界向东向西各划出7 5 经度 xff0c 作为0时区 即0时区的经度范围是7 5 W 7 5 E 从7 5 E与7 5 W分别向东 向西每15 经度划分为一个时区 xff0c 直到东11区和西11区 东11
  • selenium借助AutoIt识别上传文件Java篇

    https www cnblogs com testlc p 6069460 html 官方网站 xff1a https www autoitscript com site 从网站上下载AutoIt并安装 xff0c 安装完成在菜单中会看到
  • 【学习记录】贝叶斯滤波详解

    贝叶斯滤波详解 贝叶斯滤波的用途 xff08 Bayesian Filtering xff09 xff1a 贝叶斯滤波理论的应用可谓十分广泛 我们知道 xff0c 在机器人运动过程中 xff0c 有两个方面的信息来源 xff0c 一个是通过

随机推荐

  • c++好用的网站

    目录 洛谷www luogu com cn 有道小图灵https oj youdao com csp 维基https oi wiki org 信奥赛一本通http ybt ssoier cn 8088 index php 1 xff0c 洛
  • PX4uORB介绍[1]-常见IPC机制

  • ubuntu修改.bashrc文件

    使用如下命令修改 bashrc文件 xff1a gedit bashrc
  • PX4中文维基——光流部分

    觉得需要用到的内容复制在下面 光流 官网英文原文地址 xff1a http dev px4 io optical flow outdoors html Optical Flow uses a downward facing camera a
  • px4flow源码分析

    Flow c 计算光流用的是 SAD块匹配算法 第一部分是生成直方图 xff0c 第二部分是根据直方图来进行位移向量的计算 外部的 j i的for循环是采样点的循环 xff0c 内部的jj ii的循环是对于一个小邻域的采样 采样点是从 im
  • sudo apt-get update 与upgrade的用法

    在windows下安装软件 xff0c 我们只需要有EXE文件 xff0c 然后双击 xff0c 下一步直接OK就可以了 但在LINUX下 xff0c 不是这样的 每个LINUX的发行版 xff0c 比如UBUNTU xff0c 都会维护一
  • MATLAB标定工具箱的使用

    MATLAB标定工具箱的使用 用VS2012 43 OpenCV2 4 6写的双目标定的程序 xff08 其实就是跑的Samples xff09 xff0c 实验结果一直很不理想 xff0c 查看很多Blog xff0c 说可以先用MATL
  • C语言中%d,%o,%f,%e,%x的意义

    格式说明由 xff05 和格式字符组成 xff0c 如 xff05 d xff05 f等 它的作用是将输出的数据转换为指定的格式输出 格式说明总是由 xff05 字符开始的 不同类型的数据用不同的格式字符 格式字符有d o x u c s
  • 齐次坐标(homogeneous coordinate)

    就是将一个原本是n维的向量用一个n 43 1维向量来表示 二维点 x y 的齐次坐标表示为 hx hy h 由此可以看出 xff0c 一个向量的齐次表示是不唯一的 xff0c 齐次坐标的h取不同的值都表示的是同一个点 xff0c 比如齐次坐
  • win7下安装Ubuntu双系统(安装详解,及踩过的坑)

    前提 xff1a 网上用的u盘装双系统 xff0c 试了n次不是找到文件就是内存未分配 xff0c 各种错误 xff0c 在网上找相关的错误解决方法 xff0c 发现国内的很少 xff0c 国外的话遇到这种情况的也有 xff0c 也试了 x
  • MATLAB绘制三维曲线进行数据分析

    使用plot3函数 xff0c MATLAB官网教程 xff1a http cn mathworks com help matlab ref plot3 html s tid 61 gn loc drop plot3 x1 y1 z1 39
  • 关于STL的个人看法

    下面说的只是个人对STL的认识 不得不说 xff0c STL确实让数据结构的运用变得很简便 但我看来是有利有弊的 先说好处 xff0c 经过STL封装过的数据结构 xff0c 使用起来更加方便快捷 很多次网络赛 xff0c 用map xff
  • Ubuntu/Windows给pip换源

    文章目录 Windows给pip换源Ubuntu给pip换源 Windows给pip换源 打开appdata文件夹 xff0c 在资源管理器的地址栏输入 appdata 后回车 xff1a 或者win 43 r打开命令运行 xff0c 然后
  • The directory '/home/cds/.cache/pip/http' or its parent directory is not owned by the current user

    使用指令 span class token function sudo span span class token function chown span R root home span class token variable USER
  • window10将wsl升级到wsl2

    文章目录 微软 Win10 版本 2004 系统升级WSL到WSL2第一步 xff1a 打开系统虚拟机平台第二步 xff1a 安装WSL2第三步 xff1a 将wsl2设置为默认 WSL 2 中的新增功能将分发版版本设置为 WSL 1 或
  • conan-c++包管理工具安装及使用指南

    本篇文章的代码都在这里备份 文章目录 一 conan介绍1 1 简单介绍1 2 conna特点1 3 跨平台 二 conan全平台安装三 使用conan教程四 快速总结conan 一 conan介绍 跨平台c c 43 43 包管理工具py
  • C语言中的sizeof和strlen的区别

    sizeof strelen 先说结论 xff0c 喜欢授之以渔的可以看后面结束 1 不同点 sizeof 是单目运算符 xff0c strlen 是函数 sizeof 返回是 字串 字符所在变量 xff0c 实际占用的内存大小 单位是字节
  • adb通过Wi-Fi连接小米手机

    手机设置 打开开发者选项 打开无线调试 选择这里 有了配对密码和地址 xff0c 我们就可以使用shell连接了 shell连接 span class token punctuation span base span class token
  • python多进程教程

    1 进程的概念 进程是计算机中的一个基本概念 xff0c 它是指正在运行的程序的实例 每个进程都有自己的内存空间 代码 数据和文件等资源 xff0c 进程之间相互独立 xff0c 互不干扰 2 多进程编程的优点 多进程编程可以利用多核CPU
  • python多进程教学-超多模版例子代码

    文章目录 Python 多进程教程什么是多进程 xff1f multiprocessing模块的基本用法进程池 多进程例子例子1 xff1a 计算密集型任务例子2 xff1a IO密集型任务例子3 xff1a 共享内存 进程池例子例子1 x