「Python入门」Python多进程

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
大数据开发治理平台 DataWorks,不限时长
简介: 本文探讨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等资源,所以对于这种情况下,我们可以选择多线程来执行。

相关文章
|
6天前
|
数据采集 存储 JSON
Python爬虫开发:BeautifulSoup、Scrapy入门
在现代网络开发中,网络爬虫是一个非常重要的工具。它可以自动化地从网页中提取数据,并且可以用于各种用途,如数据收集、信息聚合和内容监控等。在Python中,有多个库可以用于爬虫开发,其中BeautifulSoup和Scrapy是两个非常流行的选择。本篇文章将详细介绍这两个库,并提供一个综合详细的例子,展示如何使用它们来进行网页数据爬取。
|
3天前
|
数据采集 数据可视化 算法
GitHub星标68K!Python数据分析入门手册带你从数据获取到可视化
Python作为一门优秀的编程语言,近年来受到很多编程爱好者的青睐。一是因为Python本身具有简捷优美、易学易用的特点;二是由于互联网的飞速发展,我们正迎来大数据的时代,而Python 无论是在数据的采集与处理方面,还是在数据分析与可视化方面都有独特的优势。我们可以利用 Python 便捷地开展与数据相关的项目,以很低的学习成本快速完成项目的研究。
|
4天前
|
数据采集 数据可视化 算法
GitHub星标68K!Python数据分析入门手册带你从数据获取到可视化
Python作为一门优秀的编程语言,近年来受到很多编程爱好者的青睐。一是因为Python本身具有简捷优美、易学易用的特点;二是由于互联网的飞速发展,我们正迎来大数据的时代,而Python 无论是在数据的采集与处理方面,还是在数据分析与可视化方面都有独特的优势。我们可以利用 Python 便捷地开展与数据相关的项目,以很低的学习成本快速完成项目的研究。 今天给小伙伴们分享的这份Python数据分析入门手册本着实用性的目的,着眼于整个数据分析的流程,介绍了从数据采集到可视化的大致流程。
|
7天前
|
Python
python Process 多进程编程
python Process 多进程编程
17 1
|
5天前
|
存储 算法 调度
10种 Python数据结构,从入门到精通
10种 Python数据结构,从入门到精通
7 0
|
6天前
|
机器学习/深度学习 算法 数据挖掘
机器学习新手也能飞:Python+Scikit-learn让你轻松入门!
在数据驱动的时代,机器学习是推动科技进步和智能化生活的关键。Python以简洁的语法和强大的库支持,成为机器学习的理想语言。Scikit-learn作为Python的开源机器学习库,提供简单易用的API和丰富的算法,降低了学习门槛。通过Python结合Scikit-learn,即使是初学者也能快速上手,如使用鸢尾花数据集进行分类任务,体验从数据预处理到模型训练和评估的全过程,进而探索更多机器学习的可能性。
17 0
|
6天前
|
并行计算 开发者 Python
解锁Python多进程编程的超能力:并行计算的魔法与奇迹,探索处理器核心的秘密,让程序性能飞跃!
【8月更文挑战第12天】在Python编程领域,多进程编程是一项关键技能,能有效提升程序效率。本文通过理论与实践结合,深入浅出地介绍了Python中的多进程编程。首先解释了多进程的概念:即操作系统中能够并发执行的多个独立单元,进而提高整体性能。接着重点介绍了`multiprocessing`模块,演示了如何创建和启动进程,以及进程间的通信方式,如队列等。此外,还提到了更高级的功能,例如进程池管理和同步原语等。通过这些实例,读者能更好地理解如何在实际项目中利用多核处理器的优势,同时注意进程间通信和同步等问题,确保程序稳定高效运行。
19 0
|
7天前
|
存储 Python 容器
"解锁编程奇迹,Python基础入门:一剑在手,编程江湖任你遨游,从零到英雄的超燃蜕变之旅!"
【8月更文挑战第12天】编程曾被视为复杂的技能,Python却让其变得异常亲和简单。作为优雅且强大的语言,Python以简洁的语法、丰富的库支持及广泛的应用领域,成为初学者首选。本文将引导你开启Python学习之旅,通过基础概念与示例代码,让你领略编程魅力。
21 0
|
3月前
|
人工智能 Java Python
python入门(二)安装第三方包
python入门(二)安装第三方包
|
3月前
|
Java Python 开发者
Python 学习之路 01基础入门---【Python安装,Python程序基本组成】
线程池详解与异步任务编排使用案例-xian-cheng-chi-xiang-jie-yu-yi-bu-ren-wu-bian-pai-shi-yong-an-li
496 3
Python 学习之路 01基础入门---【Python安装,Python程序基本组成】

热门文章

最新文章