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

news2024/11/17 13:47:09

一、说明

        本文简要而简明地介绍了 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.coloradmin.cn/o/1409467.html

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

相关文章

【Android】Android中的系统镜像由什么组成?

文章目录 总览Boot Loader 的加锁与解锁Boot 镜像内核RAM diskARM 中的设备树 (Device Tree) /System 和/Data 分区镜像参考 总览 各种Android设备都只能刷专门为相应型号的设备定制的镜像。 厂商会提供一套系统镜像把它作为“出厂默认”的 Android 系统刷在设备上。 一个完…

Obsidian - 使用小记(Typora切换过来)

文章目录 关于 Obsidian打开已有的 文件夹将图片改为 Typora 的保存文件夹 关于 Obsidian 官网 https://obsidian.md/github : https://github.com/obsidianmd 个人版免费 一直习惯用 Typora 编写markdown git 记录笔记,多次被安利 Obsidian 后,今天尝…

OFD格式文件预览解决方案

问题 项目中文件预览统一采用的是pc端转pdf后在移动端上面采用Pdfview这个组件进行查看,现后端暂不支持ofd转pdf采用ofd.umd.js查看ofd文件,用WebView直接访问后端给的预览地址会出现跨域问题。 解决办法 拿到pc端预览的ofd.umd.js文件编写预览ofd文件…

JSON-handle工具安装及使用

目录 介绍下载安装简单操作 介绍 JSON-Handle 是一款非常好用的用于操作json的浏览器插件,对于开发人员和测试人员来说是一款很好用的工具,如果你还没有用过,请赶紧下载安装吧,下面是安装过程和具体使用。 下载安装 点击下载JSON…

IaC基础设施即代码:使用Terraform 连接huaweicloud华为云 并创建后端OBS

目录 一、实验 1.环境 2.huaweicloud华为云创建用户 3.Windows使用Terraform 连接 huaweicloud 4.Windows给Terraform项目添加huaweicloud华为云OBS (实现代码与资源分离) 二、问题 1. Windows terraform 初始化失败 2.Terraform 初始化后端资源失…

Sulfo Cy2 Biotin,水溶性 Cy2 生物素,能够与各种氨基基团特异性结合

您好,欢迎来到新研之家 文章关键词:Sulfo Cyanine2 Biotin,Sulfo Cy2 Biotin,水溶性 Cy2 生物素,Sulfo-Cy2-Biotin,水溶性-Cy2-生物素 一、基本信息 产品简介:Sulfo Cyanine2 Biotin, also k…

el-dialog的close事件会执行两次

如果close事件执行的方法有传参,那么定义一个变量传参,而不是写死 如果写死

66.Spring是如何整合MyBatis将Mapper接口注册为Bean的原理?

原理 首先MyBatis的Mapper接口核心是JDK动态代理 Spring会排除接口,无法注册到IOC容器中 MyBatis 实现了BeanDefinitionRegistryPostProcessor 可以动态注册BeanDefinition 需要自定义扫描器(继承Spring内部扫描器ClassPathBeanDefinitionScanner ) 重…

成熟的内外网数据交换方案,如何实现跨网传输?

网络迅速发展,我们可以从网络上查找到各式各样的信息,但是同时网络安全问题也随之严重。近几年,各种有关网络安全的新闻不断被报道,数据泄露给很多企业带来了严重打击,不仅是经济损失,严重者还会对企业的声…

AI嵌入式K210项目(20)-MicroPython介绍

文章目录 前言一、MicroPython是什么?二、官方文档学习实验过程总结 前言 单片机嵌入式编程经历了汇编、 C 语言的发展历程,可以说是一次编程革命,其背后的原因是单片机的速度越来越快,集成度越来越高。而这一趋势并没停止&#…

Linux第35步_在“移植uboot”前安装“libncurses5-dev,bison和flex”工具

在“移植uboot”前,需要在Ubuntu中安装“libncurses5-dev,bison和flex”工具,否则在“编译uboot”时,会报错。 一、了解相关知识 1、libncurses5-dev库是一个在Linux/Unix下广泛应用的图形函数库。 2、bison是用C编写的语法解析…

excel甘特图怎么做?这种方法一目了然

excel甘特图怎么做?在现代项目管理中,甘特图作为一种可视化工具,被广泛应用于规划、执行和监控项目进度。在Excel中创建甘特图是一个强大的工具,可以用来规划和跟踪项目进度。下面就教教你如何使用Excel制作甘特图。 一、了解甘特…

泥土

当我们置身于大自然中,或许很少有人会特别留意到泥土,因为它显得如此平凡而不起眼。然而,泥土却是地球上最基础、最重要的元素之一,是生命的孕育之源。 泥土,那深埋在地底的黑褐色质地,看似普通无比&#…

C++——类型转换与特殊类设计

我们在C语言中经常会使用到强制类型转换,例如指针和整形之间的转换是最为常见的,但是 在C中,C设计师认为这种强制类型转换是不安全的,所以在C标准中加入了四种强制 类型转换风格,这就是我将要介绍的强制类型转换。 在某…

《Windows核心编程》若干知识点实战应用分享

目录 1、进程的虚拟内存分区与小于0x10000的小地址内存区 1.1、进程的虚拟内存分区 1.2、小于0x10000的小地址内存区 2、保存线程上下文的CONTEXT结构体 3、从汇编代码角度去理解多线程运行过程的典型实例 4、调用TerminateThread强制结束线程会导致线程中的资源没有释放…

『OpenCV-Python|鼠标作画笔』

Opencv-Python教程链接:https://opencv-python-tutorials.readthedocs.io/ 本文主要介绍OpenCV-Python如何将鼠标作画笔绘制圆或者矩形。 示例一:图片上双击的位置绘制一个圆圈 首先创建一个鼠标事件回调函数,鼠标事件发生时就会被执行。鼠标…

Git学习笔记(第9章):国内代码托管中心Gitee

目录 9.1 简介 9.1.1 Gitee概述 9.1.2 Gitee帐号注册和登录 9.2 VSCode登录Gitee账号 9.3 创建远程库 9.4 本地库推送到远程库(push) 9.5 导入GitHub项目 9.6 删除远程库 9.1 简介 9.1.1 Gitee概述 众所周知,GitHub服务器在国外,使用GitHub作为…

51-15 视频理解串讲—TimeSformer论文精读

今天读的论文题目是Is Space-Time Attention All You Need for Video Understanding? Facebook AI提出了一种称为TimeSformer视频理解的新架构,这个架构完全基于transformer,不使用卷积层。它通过分别对视频的时间和空间维度应用自注意力机制&#xff…

山西电力市场日前价格预测【2024-01-26】

日前价格预测 预测说明: 如上图所示,预测明日(2024-01-26)山西电力市场全天平均日前电价为309.45元/MWh。其中,最高日前电价为587.20元/MWh,预计出现在18:15。最低日前电价为0.00元/MWh,预计出…

2016年认证杯SPSSPRO杯数学建模A题(第一阶段)洗衣机全过程文档及程序

2016年认证杯SPSSPRO杯数学建模 A题 洗衣机 原题再现: 洗衣机是普及率极高的家用电器,它给人们的生活带来了很大的方便。家用洗衣机从工作方式来看,有波轮式、滚筒式、搅拌式等若干种类。在此基础上,各厂商也推出了多种具体方案…