【python】-详解进程与线程

news2025/7/14 13:03:42

文章目录

    • 进程
      • 1、多任务
      • 2、进程介绍
      • 3、多进程
        • 1 进程的创建步骤
        • 2 通过进程类创建进程对象
        • 3 进程的创建与启动代码
      • 4、进程执行带有参数的任务
        • 1 进程执行带有参数的任务
        • 2 args 参数的使用
        • 3 kwargs 参数的使用
        • 4 代码实现
      • 5 获取进程编号
        • 1 os.getpid()的使用
        • 2 os.getppid()的使用
        • 3 代码实现
        • 4 注意点
    • 线程
      • 1 线程的介绍
      • 2 多线程完成多任务
        • 1 线程的创建步骤
        • 2 线程的创建与启动的代码
      • 3 线程执行带有参数的任务
      • 4 主线程与子线程的结束顺序
      • 5 线程 间的执行顺序
      • 6 进程和线程的对比
        • 1 关系对比
        • 2 区别对比

进程

1、多任务

(1)概念:同一时间执行多个任务,打开QQ的同时也可以打开微信

(2)作用:充分利用CPU资源,提高程序的执行效率

(3)表现形式:

  • 并发:在一段时间内交替去执行多个任务(对于单核CPU处理)
  • 并行:在一段时间内真正的同时一起执行多个任务(对于多核CPU)

2、进程介绍

(1)概念:进程是资源分配的最小单位,它是操作系统进行资源分配和调度运行的基本单位。也即
一个正在运行的程序就是一个进程

在这里插入图片描述

3、多进程

1 进程的创建步骤

  • 导入进程包

    ​ import multiprocessing

  • 通过进程类创建进程对象

    ​ 进程对象=multiprocessing.Process()

  • 启动进程执行任务

    ​ 进程对象.start()

2 通过进程类创建进程对象

进程对象=multiprocessing.Process(target=任务名)

在这里插入图片描述

3 进程的创建与启动代码

###单任务
import time
'''
以下这种形式就是先唱完歌才能接着跳舞
共执行的时间是:3s
'''

#唱歌
def sing():
    for i in range (3):
        print("唱歌。。。。")
        time.sleep(0.5)

#跳舞
def dance():
    for i in range(3):
        print("跳舞。。。。")
        time.sleep(0.5)

if __name__ == '__main__':
    time_start=time.time()
    sing()
    dance()
    time_end=time.time()
    print("共耗费:",time_end-time_start)

'''
唱歌。。。。
唱歌。。。。
跳舞。。。。
跳舞。。。。
跳舞。。。。
共耗费: 3.0499579906463623
'''
#多任务多进程
import time
#1、导入进程包
import multiprocessing
'''
1、导入进程包
2、使用进程类创建进程对象
3、使用进程对象启动进程执行任务

'''
#唱歌
def sing():
    for i in range (3):
        print("唱歌。。。。")
        time.sleep(0.5)

#跳舞
def dance():
    for i in range(3):
        print("跳舞。。。。")
        time.sleep(0.5)



if __name__ == '__main__':
    time_start = time.time()

    #2、使用进程类创建进程对象
    sing_process=multiprocessing.Process(target=sing)
    dance_process=multiprocessing.Process(target=dance)
    #3、使用进程对象启动进程执行任务
    sing_process.start()
    dance_process.start()

    time_end = time.time()
    print("共耗费:", time_end - time_start)
'''
唱歌跳舞同时进行
共耗费: 0.016045808792114258
唱歌。。。。
跳舞。。。。
跳舞。。。。
唱歌。。。。
唱歌。。。。
跳舞。。。。
'''

4、进程执行带有参数的任务

1 进程执行带有参数的任务

在这里插入图片描述

2 args 参数的使用

  • 多参数的时候,需要按照顺序

在这里插入图片描述

3 kwargs 参数的使用

  • 字典的键要与传的参数一致
  • 不需要按照顺序执行

在这里插入图片描述

4 代码实现

import time
#1、导入进程包
import multiprocessing
'''
1、导入进程包
2、使用进程类创建进程对象
3、使用进程对象启动进程执行任务

'''
#唱歌
def sing(num,name):
    for i in range (num):
        print("{} :唱歌。。。。{}".format(name,i))
        time.sleep(0.5)
#跳舞
def dance(num,name):
    for i in range(num):
        print("{}:跳舞。。。。{}".format(name,i))
        time.sleep(0.5)
if __name__ == '__main__':
    time_start = time.time()
    #2、使用进程类创建进程对象
    sing_process=multiprocessing.Process(target=sing,args=(3,"蔡徐坤"))
    dance_process=multiprocessing.Process(target=dance,kwargs={'name':"吴亦凡",'num':3})
    #3、使用进程对象启动进程执行任务
    sing_process.start()
    dance_process.start()
    time_end = time.time()
    print("共耗费:", time_end - time_start)

5 获取进程编号

作用:当进程的数量越来越多,如果没有办法区分主进程和子进程,无法进行有效的进程管理。

获取进程的编号:

  • 获取当前进程编号

    ​ os.getpid()

  • 获取当前父进程编号

    ​ os.getppid()

1 os.getpid()的使用

在这里插入图片描述

2 os.getppid()的使用

在这里插入图片描述

3 代码实现

def sing(num,name):
    print("唱歌进程的pid:",os.getpid())
    print("唱歌进程的父进程pid:", os.getppid())
def dance(num,name):
    print("跳舞进程的pid:", os.getpid())
    print("跳舞进程的父进程:", os.getppid())
if __name__ == '__main__':
    print("主进程的pid:",os.getpid())
'''
主进程的pid: 52044
唱歌进程的父进程pid: 52044
跳舞进程的父进程pid: 52044
'''

4 注意点

  • 主进程会等待所有的子进程执行结束后再使用

  • 设置守护主进程:主进程退出后直接销毁,不再执行子进程中的代码

    • work_process.daemon=True
def work():
    for i in range(10):
        print("工作中....")
        time.sleep(0.2)

if __name__ == '__main__':
    work_press=multiprocessing.Process(target=work)
    work_press.daemon=True
    work_press.start()
    time.sleep(2)
    print("主进程工作中...")
'''
工作中....
工作中....
工作中....
工作中....
工作中....
主进程工作中...
'''

线程

1 线程的介绍

进程是分配资源的最小单位,一旦创建一个进程就会分配一定的资源,就像两人聊QQ需要打开两个QQ软件一样,一样浪费资源。

线程是程序执行的最小的单位。进程是只负责分配资源,而利用资源执行程序的是线程。进程是线程的容器,一个进程中最少有一个线程来负者执行程序。线程不需要中间拥有系统资源,只需要一点在运行中必不可少的资源,同一个进程的其他线程共享所拥有的全部资源。好比QQ软件(进程)打开两个窗口(两个线程)跟两个人聊天。

在这里插入图片描述

在这里插入图片描述

从上面两张图片可以看出,进程看成两个人干两件事(打开QQ、微信),线程是一个人干两件事(分别找两个人聊天)

2 多线程完成多任务

1 线程的创建步骤

  • 导入线程模块

    ​- import threading

  • 通过线程类创建线程对象

    ​- 线程对象=threading.Thread(target=任务名)

    在这里插入图片描述

  • 启动线程执行任务

    ​ 线程对象.start()

2 线程的创建与启动的代码

在这里插入图片描述

if __name__ == '__main__':
    sing_thread=threading.Thread(target=sing)
    dance_thread=threading.Thread(target=dance)
    sing_thread.start()
    dance_thread.start()

3 线程执行带有参数的任务

与进程的创建方法一样,就不写了

在这里插入图片描述

4 主线程与子线程的结束顺序

  • 设置守护主线程方式1:

    work_press=threading.Thread(target=work,daemon=True)
    
  • 方式2:

    work_press.setDaemon(True)
    

5 线程 间的执行顺序

1 线程之间的执行顺序是 无序的 ,是由CPU随机调度的

2 获取当前的线程信息

6 进程和线程的对比

1 关系对比

  • 线程是依附在进程里面的,没有进程就没有线程
  • 一个进程默认提供一条线程,进程可以创建多个线程

2 区别对比

  • 创建进程的开销要比创建线程的开销大
  • 进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位
  • 线程不是孤立执行,必须依存在进程之中

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

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

相关文章

PLC中ST编程的定时器

定义通电延时功能块TON的变量,掉电延时功能块TOF的变量; 通过实例名来使用定时器; IN: 和 PT: 是输入引脚,Q> 和 ET> 是输出引脚; 定时器的通过IN输入引脚来触发的;定时器尽量不要在IF内调用&#…

ceph集群的搭建

ceph集群部署(准备阶段) 1. 配置静态网络(自选) 配置静态IP 2. 配置主机名(必做) ceph01: hostnamectl set-hostname ceph01ceph02: hostnamectl set-hostname ceph02ceph03&a…

[C++]打开新世界的大门之C++入门

🥁作者:华丞臧 📕​​​​专栏:【C】 各位读者老爷如果觉得博主写的不错,请诸位多多支持(点赞收藏关注)。如果有错误的地方,欢迎在评论区指出。 推荐一款刷题网站 👉LeetCode 目录 一、C关键字…

iOS适配Unity-2019

iOS适配Unity-2019 背景 由于2019起,Unity的Xcode工程,更改了项目结构。 Unity 2018的结构: 可以看Targets只有一个Unity-iPhone,Unity-iPhone直接依赖管理三方库。 Unity2019以后: Targets多了一个UnityFramework…

什么是地理信息系统(GIS)?

什么是地理信息系统(GIS)? 什么是地理信息系统(GIS)?GIS是一个收集、显示、管理和分析地理信息的系统。让我们进一步探讨地理信息系统的所有方面。 地理信息系统(GIS)将地理与数据连…

读《大话数据结构》溢彩加强版

源代码: C:\迅雷下载\2021072816023491335\59e95a4689eeb92f380f4ab2\202107\29976aaa-ef7a-11eb-aba5-00163e0a088c PPT: C:\迅雷下载\2021072816023491335\59e95a4689eeb92f380f4ab2\202009\942a5ce8-fe34-11ea-a6a1-00163e0396a1 参考文献: C:\迅雷下…

SpringBoot整合JSR-303表单校验

JSR-303表单校验 思考一个问题,引出JSR-303 为什么前端做了参数校验,后端还要进行参数校验? 普通用户通过页面操作,前端可以校验住参数的正确性。但如果有人获取到接口,利用接口调用工具比如:postman对后…

Python 基础测试题(含答案)

一、 选择题:每小题 2 分,共 40 分。 1、 下列标识符命名中, 符合规范的是( )。 A、 1_a B、 for C、 年龄 D、 a#b 2、 下列标识符中,不是 Python 支持的数据类型的是 ( )。 A、…

深度学习之Python,OpenCV中的卷积

这篇博客将介绍图像内核和卷积。如果将图像视为一个大矩阵,那么图像内核只是一个位于图像顶部的微小矩阵。从左到右和从上到下滑动内核,计算输入图像和内核之间的元素乘法总和——称这个值为内核输出。内核输出存储在与输入图像相同 (x&#…

数据结构(高阶)—— 红黑树

目录 一、红黑树的概念 二、红黑树的性质 三、红黑树的结点定义 四、红黑树的插入 五、红黑树的验证 六、红黑树与AVL树的比较 一、红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加了一个存储位表示结点的颜色,可以使Red或Bl…

升级打怪拿offer,10w+字总结的Java面试题(附答案)够你刷

升级打怪拿offer,献上熬夜整理最新“10w字总结的Java面试题(附答案)”够你刷! 其包含的内容模块有:基础、JVM、多线程与高并发、Spring、MyBatis、SpringBoot、MYSQL、SpringCloud、Dubbo、Nginx、MQ、数据结构与算法…

CF104064 E. Exchange Students(NWERC2021)

题目分析 首先需要观察到一个性质:在最优方案下的操作一定是首先交换距离最近能交换的两个点来达到交换的效果,这个很好理解:题目要求如果要交换两个人的位置,中间的人的身高必须严格小于这两个人,因此合法的交换操作仅…

生成对抗网络(GAN)

GAN简介 GAN思想是一种二人的零和博弈思想,GAN中有两个博弈者,一个生成器(G),一个判别器(D),这两个模型都有各自的输入和输出。具体功能如下: 生成器(G&…

声门脉冲语音处理

对于 0<t<tpeak&#xff0c;gattack(t) 攻击部分&#xff0c;即上升分支的时间&#xff0c;时间 t 的范围从 0 秒到最大峰值时间 tpeak &#xff0c;图示例中选择为大约总长度的 35%&#xff0c;即 tpeak35%⋅T0&#xff0c;或者在样本 Lattack⌊35%⋅Lg⌉ 中&#xff0c…

2023年系统规划与设计管理师-第三章信息技术服务知识

一. 思维导图 二.IT 服务管理 (ITSM) 1. 什么是 IT 服务管理 (ITSM)&#xff1f; IT 服务管理 (ITSM) 包含一组策略和实践&#xff0c;这些策略和实践可用于为最终用户实施、交付和管理 IT 服务&#xff0c;以满足最终用户的既定需求和企业的既定目标。 在此定义中&#xff0…

otn 709帧结构

otn架构说明: 基于G.709接口,包括波分侧和客户侧,客户侧通常用于互联互通。 光通路净荷单元:OPU0/OPU1/OPU2/OPU3/OPU4/flex,主要用于完成业务同步或异步映射; 光通路数据单元:ODU0/ODU1/ODU2/ODU3/ODU4/ODU-flex,完成通道连接性能监测和子速率复用、 光通路传送单元…

POJ1008:玛雅日历

一、Description During his last sabbatical, professor M. A. Ya made a surprising discovery about the old Maya calendar. From an old knotted message, professor discovered that the Maya civilization used a 365 day long year, called Haab, which had 19 months.…

Netty学习笔记

文章目录二、Netty 入门2.1、概述2.1.1、Netty 是什么&#xff1f;2.1.2、Netty 的作者2.1.3、Netty 的地位2.1.4、Netty 的优势2.2、Hello World2.2.1、目标2.2.2、服务器端2.2.3、客户端2.2.4、流程梳理&#x1f4a1; 提示2.3、组件2.3.1、EventLoop&#x1f4a1; 优雅关闭演…

保姆级二进制安装高可用k8s集群文档(1.23.8)

保姆级二进制安装高可用k8s集群文档k8s搭建方式前期准备集群规划机器准备1、master vagrantfile2、master install.sh3、node vagrantfile4、node install.sh5、时间同步vagran 启动脚本vagrant up注意点安装conntrack 工具ipvs的安装VBoxManage snapshot 准备虚拟机快照ETCD部…

C语言编程作业参考答案

编程题参考答案 文章目录编程题参考答案week1_test选择结构-编程题循环结构上机练习数组编程函数编程2week1_test Write a program to output the average of 2 integers. #include <stdio.h>void main(){int a , b;double c;printf("Please enter 1 integers\n&q…