「Python入门」Python多进程

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 本文探讨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()

在这里插入图片描述

二、 多进程

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

# 多进程
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()

在这里插入图片描述

三、 带参多进程

  • 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()

![在这里插入图片描述](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()

在这里插入图片描述

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

# 主进程会等待所有的子进程执行结束再结束
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("主进程结束了……")

在这里插入图片描述

六、 子进程守护

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

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

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

相关文章
|
17天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
22天前
|
机器学习/深度学习 数据可视化 数据挖掘
使用Python进行数据分析的入门指南
本文将引导读者了解如何使用Python进行数据分析,从安装必要的库到执行基础的数据操作和可视化。通过本文的学习,你将能够开始自己的数据分析之旅,并掌握如何利用Python来揭示数据背后的故事。
|
18天前
|
IDE 程序员 开发工具
Python编程入门:打造你的第一个程序
迈出编程的第一步,就像在未知的海洋中航行。本文是你启航的指南针,带你了解Python这门语言的魅力所在,并手把手教你构建第一个属于自己的程序。从安装环境到编写代码,我们将一步步走过这段旅程。准备好了吗?让我们开始吧!
|
18天前
|
测试技术 开发者 Python
探索Python中的装饰器:从入门到实践
装饰器,在Python中是一块强大的语法糖,它允许我们在不修改原函数代码的情况下增加额外的功能。本文将通过简单易懂的语言和实例,带你一步步了解装饰器的基本概念、使用方法以及如何自定义装饰器。我们还将探讨装饰器在实战中的应用,让你能够在实际编程中灵活运用这一技术。
37 7
|
19天前
|
开发者 Python
Python中的装饰器:从入门到实践
本文将深入探讨Python的装饰器,这一强大工具允许开发者在不修改现有函数代码的情况下增加额外的功能。我们将通过实例学习如何创建和应用装饰器,并探索它们背后的原理和高级用法。
34 5
|
18天前
|
机器学习/深度学习 人工智能 算法
深度学习入门:用Python构建你的第一个神经网络
在人工智能的海洋中,深度学习是那艘能够带你远航的船。本文将作为你的航标,引导你搭建第一个神经网络模型,让你领略深度学习的魅力。通过简单直观的语言和实例,我们将一起探索隐藏在数据背后的模式,体验从零开始创造智能系统的快感。准备好了吗?让我们启航吧!
44 3
|
22天前
|
Python
Python编程入门:从零开始的代码旅程
本文是一篇针对Python编程初学者的入门指南,将介绍Python的基本语法、数据类型、控制结构以及函数等概念。文章旨在帮助读者快速掌握Python编程的基础知识,并能够编写简单的Python程序。通过本文的学习,读者将能够理解Python代码的基本结构和逻辑,为进一步深入学习打下坚实的基础。
|
7月前
|
Python
【Python30天速成计划】10.异步以及多进程和多线程
【Python30天速成计划】10.异步以及多进程和多线程

热门文章

最新文章