Python 中的多进程(01/2):简介

一、说明

        本文简要而简明地介绍了 Python 编程语言中的多处理(多进程)。解释多处理的基本信息,如什么是多处理?为什么用多处理?在python中怎么办等。

二、什么是多处理?

        多处理是指系统同时支持多个处理器的能力。多处理系统中的应用程序被分解为独立运行的较小例程。操作系统将这些线程分配给处理器,从而提高系统的性能。

三、为什么选择多处理?

        考虑具有单个处理器的计算机系统。如果同时为它分配了多个进程,它将不得不中断每个任务并短暂切换到另一个任务,以保持所有进程的运行。
这种情况就像一个厨师独自在厨房工作一样。他必须做几项任务,如烘烤、搅拌、揉面团等。

        因此,要点是:您必须同时完成的任务越多,跟踪所有任务就越困难,并且保持正确的时间安排变得更加具有挑战性。
这就是多处理概念的由来!
        多处理系统可以具有:

  • 多处理器,即具有多个中央处理器的计算机。
  • 多核处理器,即具有两个或多个独立实际处理单元(称为“内核”)的单个计算组件。

        在这里,CPU 可以轻松地一次执行多个任务,每个任务都使用自己的处理器。

        这就像最后一种情况下的厨师得到助手的帮助一样。现在,他们可以在他们之间分配任务,厨师不需要在他的任务之间切换。

四、Python 中的多处理

        在 Python 中,multiprocessing 模块包含一个非常简单直观的 API,用于在多个进程之间划分工作。
        让我们考虑一个使用多处理模块的简单示例:

# importing the multiprocessing module
import multiprocessing
  
def print_cube(num):
    """
    function to print cube of given num
    """
    print("Cube: {}".format(num * num * num))
  
def print_square(num):
    """
    function to print square of given num
    """
    print("Square: {}".format(num * num))
  
if __name__ == "__main__":
    # creating processes
    p1 = multiprocessing.Process(target=print_square, args=(10, ))
    p2 = multiprocessing.Process(target=print_cube, args=(10, ))
  
    # starting process 1
    p1.start()
    # starting process 2
    p2.start()
  
    # wait until process 1 is finished
    p1.join()
    # wait until process 2 is finished
    p2.join()
  
    # both processes finished
    print("Done!")
Square: 100
Cube: 1000
Done!

        让我们试着理解上面的代码:

  • 要导入多处理模块,我们执行以下操作:
    import multiprocessing
    
  • 为了创建一个进程,我们创建了一个 Process 类的对象。它需要以下参数:
    • target:进程要执行的功能
    • args:要传递给目标函数的参数

    注意:进程构造函数还采用许多其他参数,稍后将讨论这些参数。在上面的示例中,我们创建了 2 个具有不同目标函数的进程:

    p1 = multiprocessing.Process(target=print_square, args=(10, ))
    p2 = multiprocessing.Process(target=print_cube, args=(10, ))
    
  • 为了启动一个进程,我们使用 Process 类的 start 方法。
    p1.start()
    p2.start()
    
  • 一旦进程启动,当前程序也会继续执行。为了在进程完成之前停止当前程序的执行,我们使用 join 方法。
    p1.join()
    p2.join()
    

    因此,当前程序将首先等待 p1 的完成,然后是 p2。一旦它们完成,就会执行当前程序的下一个语句。

        让我们考虑另一个程序来理解在同一 python 脚本上运行的不同进程的概念。在下面的示例中,我们打印运行目标函数的进程的 ID:

# importing the multiprocessing module
import multiprocessing
import os
  
def worker1():
    # printing process id
    print("ID of process running worker1: {}".format(os.getpid()))
  
def worker2():
    # printing process id
    print("ID of process running worker2: {}".format(os.getpid()))
  
if __name__ == "__main__":
    # printing main program process id
    print("ID of main process: {}".format(os.getpid()))
  
    # creating processes
    p1 = multiprocessing.Process(target=worker1)
    p2 = multiprocessing.Process(target=worker2)
  
    # starting processes
    p1.start()
    p2.start()
  
    # process IDs
    print("ID of process p1: {}".format(p1.pid))
    print("ID of process p2: {}".format(p2.pid))
  
    # wait until processes are finished
    p1.join()
    p2.join()
  
    # both processes finished
    print("Both processes finished execution!")
  
    # check if processes are alive
    print("Process p1 is alive: {}".format(p1.is_alive()))
    print("Process p2 is alive: {}".format(p2.is_alive()))
ID of main process: 28628
ID of process running worker1: 29305
ID of process running worker2: 29306
ID of process p1: 29305
ID of process p2: 29306
Both processes finished execution!
Process p1 is alive: False
Process p2 is alive: False
  • 主 python 脚本具有不同的进程 ID,当我们创建进程对象 p1 和 p2 时,multiprocessing 模块会生成具有不同进程 ID 的新进程。在上面的程序中,我们使用 os.getpid() 函数来获取运行当前目标函数的进程的 ID。

    请注意,它与 p1 和 p2 的进程 ID 匹配,我们使用 Process 类的 pid 属性获取这些 ID。

  • 每个进程独立运行,并有自己的内存空间。
  • 一旦目标函数的执行完成,进程就会终止。在上面的程序中is_alive我们使用了 Process 类的方法来检查进程是否仍处于活动状态。

        请考虑下图,了解新进程与主 Python 脚本有何不同?:
        所以,这是对 Python 中多处理的简要介绍。接下来的几篇文章将介绍以下与多处理相关的主题:

  • 使用 Array、value 和 queues 在进程之间共享数据。
  • 多处理中的锁和池概念

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/645914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言第八弹---一维数组

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 一维数组 1、数组的概念 2、⼀维数组的创建和初始化 2.1、数组创建 2.2、数组的初始化 2.3、数组的类型 3、⼀维数组的使用 3.1、数组下标 3.2、数组元素…

Vscode配置python代码开发

文章目录 1. 配置python运行环境2. 常用插件说明3. Vscode配置文件说明3.1 setting.json配置说明3.2 launch.json配置说明 4. 远程开发5. 其他配置 1. 配置python运行环境 安装python插件:点击VSCode左侧边栏中的扩展图标(或按 CtrlShiftX)&a…

从方法论到最佳实践,深度解析企业云原生 DevSecOps 体系构建

作者:匡大虎 引言 安全一直是企业上云关注的核心问题。随着云原生对云计算基础设施和企业应用架构的重定义,传统的企业安全防护架构已经不能够满足新时期下的安全防护要求。为此企业安全人员需要针对云原生时代的安全挑战重新进行系统性的威胁分析并构…

ubuntu20.04 格式化 硬盘 扩展硬盘

如何在 Ubuntu 22.04 LTS 上安装分区编辑器 GParted?_gparted安装-CSDN博客 sudo apt install gparted 步骤5:启动GParted 安装完成后,您可以在应用程序菜单中找到GParted。点击它以启动分区编辑器。 通过以上步骤,您可以在Ubun…

深度视觉目标跟踪进展综述-论文笔记

中科大学报上的一篇综述,总结得很详细,整理了相关笔记。 1 引言 目标跟踪旨在基于初始帧中指定的感兴趣目标( 一般用矩形框表示) ,在后续帧中对该目标进行持续的定位。 基于深度学习的跟踪算法,采用的框架包括相关滤波器、分类…

CSIT883系统分析与项目管理——Lecture9重点概念

文章目录 一、前言二、重点概念三、题目分析一、前言 本次课的主要内容有系统设计基础与项目沟通管理。系统设计基础当中有许多重点概念,比如设计完整性控制与如何进行系统设计,访问控制等等。项目沟通管理当中主要介绍如何在项目团队当中进行沟通的方法,面对不同的人,不同…

Rust 通用代码生成器莲花发布红莲尝鲜版二十视频,支持 Nodejs 21,18 和 14

Rust 通用代码生成器莲花发布红莲尝鲜版二十视频,支持 Nodejs 21,18 和 14 Rust 通用代码生成器莲花发布红莲尝鲜版二十视频。此版本开始支持 Nodejs21,18 加上原来支持的 Nodejs 14。现在莲花支持三种 Nodejs 环境。适应性大大增强,也给您的使用带来了…

MATLAB中实现机械臂逆运动学求解的方法之一是使用阻尼最小二乘法

MATLAB中实现机械臂逆运动学求解的方法之一是使用阻尼最小二乘法。阻尼最小二乘法通常用于处理数值求解问题中的不稳定性和噪声。以下是一个简单的MATLAB代码示例,演示了机械臂逆运动学的阻尼最小二乘法求解: % 机械臂参数 L1 1; % 机械臂长度 L2 1;…

IDEA配置Maven教程

1.Maven下载 首先我们进入maven官方网站Maven – Welcome to Apache Maven,进入网页后,点击Download去下载 下载免安装版,解压即可,解压至磁盘任意目录,尽量不要取中文名如下图: 2.配置Maven环境变量 复制Maven所在的…

cms中getshell的各种姿势

cms中getshell的各种姿势 wordpress----getshell 这里wordpress后台,外观,主题,编辑,修改其中的404模版,保存后就可拿到shell 直接访问,就可以成功连接 另外,在主题中,可以上传 …

[蓝桥杯]真题讲解:景区导游(DFS遍历、图的存储、树上前缀和与LCA)

蓝桥杯真题讲解&#xff1a; 一、视频讲解二、暴力代码三、正解代码 一、视频讲解 视频讲解 二、暴力代码 //暴力代码&#xff1a;DFS #include<bits/stdc.h> #define endl \n #define deb(x) cout << #x << " " << x << \n; #de…

算法练习-螺旋矩阵(思路+流程图+代码)

难度参考 难度&#xff1a;中等 分类&#xff1a;数组 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。以下内容均为个人笔记&#xff0c;旨在督促自己认真学习。 题目 给定一个正整数n&#xff0c;生成一个包含1到 n^2 所有元…

网络组件、设备和关系网络图【推荐】

目录 网络上的设备&#xff1a; 设备和台式计算机&#xff1a; 防火墙&#xff1a; 服务器&#xff1a; 集线器和交换机&#xff1a; 路由器&#xff1a; 调制解调器和无线接入点调制解调器&#xff1a; 无线接入点&#xff1a; 网络架构&#xff08;有时称为网络设计&…

【数据存储】数据压缩算法DEFLATE

1.数据压缩算法DEFLATE 当前数据压缩领域流行的无损压缩算法有很多&#xff0c;如DEFLATE、BZIP2、LZMA、LZMA2等等&#xff0c;其中压缩速度最快的是DEFLATE压缩算法。根据对DEFLATE算法性能的实际测试&#xff0c;发现DEFLATE算法在大数据文件压缩方面的性能表现&#xff0c…

SQL 系列教程(三)

目录 SQL INNER JOIN 关键词 SQL INNER JOIN 关键词 演示数据库 内连接&#xff08;INNER JOIN&#xff09;实例 连接三个表 SQL LEFT JOIN 关键词 SQL LEFT JOIN 关键词 演示数据库 SQL LEFT JOIN 实例 SQL RIGHT JOIN 关键词 SQL RIGHT JOIN 关键词 演示数据库 …

字符串相关函数【超详细】(strcpy,strstr等string.h中的函数)

文章目录 strlen库中函数定义函数作用函数大概“工作”流程函数使用注意&#xff08;要求&#xff09;函数使用例举 strcpy库中函数定义函数作用函数使用注意&#xff08;要求&#xff09;函数大概“工作”流程函数使用例举 strcat库中函数定义函数作用函数使用注意&#xff08…

SpringMVC使用步驟

1.导入依赖坐标 <dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><!--这个依赖会跟tomcat插件有冲突&#xff0c;需要把有效范围设置为provided--><scop…

Spring Boot 中的自动配置(autoconfigure)

文中部分图片来源为 动力节点-王鹤老师的Spring Boot3.0 视频讲解中。 Spring Boot 中的自动配置&#xff08;autoconfigure&#xff09; 一、自动配置的原理二、关键注解和类1.EnableAutoConfiguration 注解2.Import 注解3.AutoConfigurationImportSelector 类4.AutoConfigura…

关于c++里string的底层存储布局

之前一直好奇&#xff0c;在c 字符串的长度是记录在什么地方的&#xff0c;今天写了个代码验证一下。 看&#xff0c;代码如下&#xff1a; // // Created by dlf on 2024/1/22. // // // Created by on 2024/1/11. // #include <iostream> #include <string>int…

外包干了2个多月,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…