「Python入门」Python多进程

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 本文探讨Python中的单进程和多进程。多进程使用`multiprocessing`库,如`Process`类,类似于`threading.Thread`。进程是操作系统分配资源的基本单位,每个程序至少有一个进程。多进程允许多个任务并发执行,提升效率,尤其在多核CPU上优于多线程,因Python的GIL限制了多线程的并行计算。文中通过吃饭睡觉打豆豆的例子,展示了单进程按顺序执行,多进程则可并发执行。还介绍了带参数的多进程、获取进程ID、主进程等待子进程结束及子进程守护等概念。在IO或网络密集型任务中,多线程和多进程各有优势,具体选择应根据任务类型和资源需求。

@TOC


前言

本文主要介绍python单进程多进程。Python 要进行多进程操作,需要用到muiltprocessing库,其中的Process类跟threading模块的Thread类很相似。
进程是指一个程序在给定数据集合上的一次执行过程,是系统进行资源分配和运行调用的独立单位。可以简单地理解为操作系统中正在执行的程序。也就说,每个应用程序都有一个自己的进程。
每一个进程启动时都会最先产生一个线程,即主线程。然后主线程会再创建其他的子线程。python的多进程性能要明显优于多线程,因为cpythonGIL对性能做了约束。

在这里插入图片描述


一、 单进程

以吃饭睡觉打豆豆为例。单进程需要先吃饭,在睡觉,最后打豆豆,次序不可打乱。

# 单进程
import time
def eat():
    for i in range(3):
        print("吃饭……")
        time.sleep(1)

def sleep():
    for i in range(3):
        print("睡觉……")
        time.sleep(1)

def play():
    for i in range(3):
        print("打豆豆……")
        time.sleep(1)

if __name__ == '__main__':
    eat()
    sleep()
    play()
AI 代码解读

在这里插入图片描述

二、 多进程

以吃饭睡觉打豆豆为例。多进程对吃饭,睡觉,打豆豆,可以交叉进行,无需按序执行。

# 多进程
import multiprocessing # 导入进程包
import time
def eat():
    for i in range(3):
        print("吃饭……")
        time.sleep(1)

def sleep():
    for i in range(3):
        print("睡觉……")
        time.sleep(1)

def play():
    for i in range(3):
        print("打豆豆……")
        time.sleep(1)

if __name__ == '__main__':
    #target:指定函数名
    eat_process = multiprocessing.Process(target=eat) # 通过进程类创建进程对象
    sleep_process = multiprocessing.Process(target=sleep)
    play_process = multiprocessing.Process(target=play)

    eat_process.start()
    sleep_process.start()
    play_process.start()
AI 代码解读

在这里插入图片描述

三、 带参多进程

  • target:指定执行的函数名。此处注意,若只有一个元素,那个逗号也是不可以省略的。
  • args:使用元组方式给指定任务传参
  • kwargs:使用字典方式给指定任务传参
    ```java

    带参多进程

    import time
    import multiprocessing

def eat(num,name):
for i in range(num):
print(name+"吃饭……")
time.sleep(1)

def sleep(num,name):
for i in range(num):
print(name+"睡觉……")
time.sleep(1)

def play(num,name):
for i in range(num):
print(name+"打豆豆……")
time.sleep(1)

if name == 'main':

# target:指定执行的函数名。此处注意,若只有一个元素,那个逗号也是不可以省略的。
# args:使用元组方式给指定任务传参
# kwargs:使用字典方式给指定任务传参
eat_process = multiprocessing.Process(target=eat,args=(3,'vitian')) # 通过进程类创建进程对象
sleep_process = multiprocessing.Process(target=sleep,args=(3,'anna'))
play_process = multiprocessing.Process(target=play,args=(3,'prince'))

eat_process.start()
sleep_process.start()
play_process.start()
AI 代码解读

![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/fedd765f33e344c69cfa7f310a3ed8b0.png)
# 四、 获取进程的编号
以吃饭睡觉打豆豆为例。主进程相同,子进程各不同。

```java
# 获取进程的编号
import time
import multiprocessing
import os


def eat(num,name):
    print("吃饭的进程ID:", os.getpid())
    print("吃饭的主进程ID:", os.getppid())
    for i in range(num):
        print(name+"吃饭……")
        time.sleep(1)


def sleep(num,name):
    print("睡觉的进程ID:", os.getpid())
    print("睡觉的主进程ID:", os.getppid())
    for i in range(num):
        print(name+"睡觉……")
        time.sleep(1)

def play(num,name):
    print("打豆豆的进程ID:", os.getpid())
    print("打豆豆的主进程ID:", os.getppid())
    for i in range(num):
        print(name+"打豆豆……")
        time.sleep(1)

if __name__ == '__main__':
    # target:指定执行的函数名
    # args:使用元组方式给指定任务传参
    # kwargs:使用字典方式给指定任务传参
    eat_process = multiprocessing.Process(target=eat,args=(3,'vitian')) # 通过进程类创建进程对象
    sleep_process = multiprocessing.Process(target=sleep,kwargs={"num": 2, "name":"anna"})
    play_process = multiprocessing.Process(target=play,args=(1,'prince'))
    print("主进程ID:", os.getpid())

    eat_process.start()
    sleep_process.start()
    play_process.start()
AI 代码解读

在这里插入图片描述

五、 主进程会等待所有的子进程执行结束再结束

# 主进程会等待所有的子进程执行结束再结束
import multiprocessing
import time


def eat():
    for i in range(10):
        print("吃饭睡觉打豆豆……")
        time.sleep(0.5)


if __name__ == '__main__':
    eat_process = multiprocessing.Process(target=eat)
    eat_process.start()

    time.sleep(1)
    print("主进程结束了……")
AI 代码解读

在这里插入图片描述

六、 子进程守护

设置子进程守护,当主进程结束时,子进程也不再继续执行,直接结束。
在这里插入图片描述

七、 多线程与单线程的取舍

多线程在IO密集型的操作下似乎也没有很大的优势(IO操作的任务再繁重一些就能体现出优势),在CPU密集型的操作下明显地比单线程线性执行性能更差,但是对于网络请求这种忙等阻塞线程的操作,多线程的优势便非常显著了。
多进程无论是在CPU密集型还是IO密集型以及网络请求密集型(经常发生线程阻塞的操作)中,都能体现出性能的优势。不过在类似网络请求密集型的操作上,与多线程相差无几,但却更占用CPU等资源,所以对于这种情况下,我们可以选择多线程来执行。

目录
打赏
0
0
0
0
10
分享
相关文章
|
14天前
|
Python字符串格式化利器:f-strings入门指南
Python字符串格式化利器:f-strings入门指南
122 80
Python与MongoDB的亲密接触:从入门到实战的代码指南
本文详细介绍了Python与MongoDB结合使用的实战技巧,涵盖环境搭建、连接管理、CRUD操作、高级查询、索引优化、事务处理及性能调优等内容。通过15个代码片段,从基础到进阶逐步解析,帮助开发者掌握这对黄金组合的核心技能。内容包括文档结构设计、批量操作优化、聚合管道应用等实用场景,适合希望高效处理非结构化数据的开发者学习参考。
49 0
揭秘Python的__init__.py:从入门到精通的包管理艺术
__init__.py是Python包管理中的核心文件,既是包的身份标识,也是模块化设计的关键。本文从其历史演进、核心功能(如初始化、模块曝光控制和延迟加载)、高级应用场景(如兼容性适配、类型提示和插件架构)到最佳实践与常见陷阱,全面解析了__init__.py的作用与使用技巧。通过合理设计,开发者可构建优雅高效的包结构,助力Python代码质量提升。
151 10
Python入门修炼:开启你在大数据世界的第一个脚本
Python入门修炼:开启你在大数据世界的第一个脚本
108 6
Python创意爱心代码大全:从入门到高级的7种实现方式
本文分享了7种用Python实现爱心效果的方法,从简单的字符画到复杂的3D动画,涵盖多种技术和库。内容包括:基础字符爱心(一行代码实现)、Turtle动态绘图、Matplotlib数学函数绘图、3D旋转爱心、Pygame跳动动画、ASCII艺术终端显示以及Tkinter交互式GUI应用。每种方法各具特色,适合不同技术水平的读者学习和实践,是表达创意与心意的绝佳工具。
1233 0
Python 编程基础与实战:从入门到精通
本文介绍Python编程语言,涵盖基础语法、进阶特性及实战项目。从变量、数据类型、运算符、控制结构到函数、列表、字典等基础知识,再到列表推导式、生成器、装饰器和面向对象编程等高级特性,逐步深入。同时,通过简单计算器和Web爬虫两个实战项目,帮助读者掌握Python的应用技巧。最后,提供进一步学习资源,助你在Python编程领域不断进步。
Python实用技巧:轻松驾驭多线程与多进程,加速任务执行
在Python编程中,多线程和多进程是提升程序效率的关键工具。多线程适用于I/O密集型任务,如文件读写、网络请求;多进程则适合CPU密集型任务,如科学计算、图像处理。本文详细介绍这两种并发编程方式的基本用法及应用场景,并通过实例代码展示如何使用threading、multiprocessing模块及线程池、进程池来优化程序性能。结合实际案例,帮助读者掌握并发编程技巧,提高程序执行速度和资源利用率。
160 0
【YashanDB 知识库】如何避免 yasdb 进程被 Linux OOM Killer 杀掉
本文来自YashanDB官网,探讨Linux系统中OOM Killer对数据库服务器的影响及解决方法。当内存接近耗尽时,OOM Killer会杀死占用最多内存的进程,这可能导致数据库主进程被误杀。为避免此问题,可采取两种方法:一是在OS层面关闭OOM Killer,通过修改`/etc/sysctl.conf`文件并重启生效;二是豁免数据库进程,由数据库实例用户借助`sudo`权限调整`oom_score_adj`值。这些措施有助于保护数据库进程免受系统内存管理机制的影响。
|
4月前
|
Linux 进程前台后台切换与作业控制
进程前台/后台切换及作业控制简介: 在 Shell 中,启动的程序默认为前台进程,会占用终端直到执行完毕。例如,执行 `./shella.sh` 时,终端会被占用。为避免不便,可将命令放到后台运行,如 `./shella.sh &`,此时终端命令行立即返回,可继续输入其他命令。 常用作业控制命令: - `fg %1`:将后台作业切换到前台。 - `Ctrl + Z`:暂停前台作业并放到后台。 - `bg %1`:让暂停的后台作业继续执行。 - `kill %1`:终止后台作业。 优先级调整:
206 5
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问