python多进程、多线程(详细)

news2024/11/15 8:00:59

多任务概念

同一时间执行多个任务

多任务优势

最大的好处是充分利用CPU资源,提高程序的执行效率

GIL锁(全局解释锁)

让一个进程中同一个时刻只有一个线程可以被CPU调用,可以解决线程安全问题,有线程锁也有进程锁

Rlock:递归锁

lock:同步锁

多任务的两种表现方式

并发:在一时间段内交替去执行多个任务

如:对于单核cpu处理多任务,操作系统轮流让各个任务交替执行

并行:在一段时间内真正的同时一起执行多个任务

如:对于多核CPU处理多任务,操作系统会给CPU的每个内核安排一个执行的任务,多个内核是真正的一起同时执行多个任务。这里需要注意多核CPU的并行的执行多任务,始终有多个任务一起执行。

程序中实现多任务的方式

进程
进程的概念

进程是资源分配的最小单位,它是操作系统进行资源分配和调度运行的基本单位,通俗理解:一个正在运行的程序就是一个进程。例如:正在运行的QQ微信等,它们都是一个进程。

多进程的作用

充分利用CPU资源,提高程序的执行效率,进程与进程之间相互隔离

进程间的数据共享

进程是资源分配的最小单元,每个进程中都维护自己独立的数据,不共享。如果想要它们之间进行共享,则可以借助一些特殊的东西来实现。

多进程完成多任务

进程的三步创建步骤

通过进程类创建进程对象

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

进程创建与启动的代码

进程执行带有参数的任务

除了target参数还有另外两种参数

参数args(以元组方式),其中元组的顺序就是任务的参数的顺序

参数kwargs(以字典方式),其中传参字典的key一定要和参数名保持一致

获取进程编号

进程编号的作用:当程序中进程的数量越来越多时,如果没有办法区分主进程和子进程,还有不同的子进程,那么就无法进行有效的进程管理,为了方便管理,实际上每个进程都是有自己编号的。

获取当前进程的编号

os.getpid()

获取当前进程父进程的编号

os.getppid()

常见方法
  1. p.start():当前进程准备就绪,等待CPU调度(工作单元其实是进程中的线程)

  1. p.join():等待当前进程的任务执行完毕后再向下继续进行

  1. p.setFaemon(布尔值):守护进程(必须放在start之前)

  1. p.setFaemon(布尔值):设置为守护进程,主进程执行完毕后,子进程也会自动关闭

  1. p.setFaemon(布尔值):设置为非守护进程,主进程等待子进程,子进程执行完毕后,主进程才会结束(默认)

  1. p.name=“xxx”:进程的名称和设置

  1. multiprocessing.current_process().name:获取当前执行代码的进程名

  1. os.getpid():获取当前进程id

  1. os.getppid():获取当前进程父进程的id

  1. len(threading.enumerate()):获取当前进程中的线程个数

  1. multiprocessing.cpu_count():获取当前cpu个数

进程的注意点

1)主进程会等待所有的子进程执行结束再结束

举例:虽然“主进程执行完成了哦”可能夹在“工作中...”,但是它输出后函数并没有结束,子进程还在执行,待子进程结束后,函数才终止

2)设置守护主进程

举例:加了这行代码后,一旦输出“主进程完成了哦”,就代表函数的终止,子进程会自动销毁,不会在执行

进程池

进程不是开得越多越好,线程池里的线程个数要适量

不建议:无限制的创建进程

建议:使用进程池

线程
线程的概念

线程是程序执行的最小单位,实际上进程只负责分配资源,而利用这些资源执行程序的是线程,也就说进程是线程的容器,一个进程中最少有一个线程来负责执行程序。同时线程自己不拥有系统资源,只需要一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。

为什么使用线程

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

但是线程自己不拥有系统资源,只需要一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源,这就像通过一个QQ软件(一个进程)打开两个窗口(两个线程)跟两个人聊天一样,实现多任务的同时也节省了资源。

多线程的作用

相比进程,实现多任务的同时也节省了资源

多线程完成多任务

线程的三步创建步骤

通过进程类创建线程对象

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

线程创建与启动的代码

线程执行带有参数的任务

除了target参数还有另外两种参数

参数args(以元组方式),其中元组的顺序就是任务的参数的顺序

参数kwargs(以字典方式),其中传参字典的key一定要和参数名保持一致

主线程和子线程的结束顺序

主线程会等待所有的子线程结束后再结束

设置守护主线程:可以让主线程不等待子线程执行完成

线程间的执行程序
  • 线程之间是无序的,是由CPU调度决定某个线程先执行的

  • 获取当前的线程信息

常见方法
  1. t.start():当前线程准备就绪(等待CPU调度,具体时间由CPU来决定)

  1. t.join():等待当前线程的任务执行完毕后再向下继续进行

  1. t.setFaemon(布尔值):守护线程(必须放在start之前)

  1. t.setFaemon(布尔值):设置为守护线程,主线程执行完毕后,子线程也会自动关闭

  1. t.setFaemon(布尔值):设置为非守护线程,主线程等待子线程子线程执行完毕后,主线程才会结束(默认)

  1. t.setName():线程的名称和设置

  1. t.threading.current_thread().getName():获取当前执行代码的线程名

线程池

线程不是开得越多越好,开的多了可能会导致系统的性能更低了。

不建议:无限制的创建线程

建议:使用线程池

进程和线程对比
关系对比

  • 线程是依托在进程里面的,没有进程就没有线程

  • 一个进程默认提供一条线程,进程可以创建多个线程

区别对比
  • 创建进程的资源开销要比创建线程的资源开销大

  • 进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位

  • 线程不能够独立运行,必须依托在进程中

优缺点对比
  • 进程优缺点

  • 优点:可以使用多核

  • 缺点:资源开销大

  • 线程优缺点

  • 优点:资源开销小

  • 缺点,不能使用多核

应用场景
  • 如果每个子进程执行需要消耗的时间非常短(执行+1操作等),这不必使用多进程,因为进程的上下文切换(启动关闭)也会耗费资源

  • 使用多进程往往是用来处理CPU密集型(科学计算)的需求,如果是IO密集型(文件读取,爬虫等)则可以使用多线程去处理

  • 想利用计算机的多核优势,让CPU同时处理一些任务,适合用多进程开发(即使资源开销大)

  • 不利用计算机的多核优势,适用于多线程开发

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

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

相关文章

「自控元件及线路」1.3 直流电动机的特性与控制方法

本节介绍电机的基本物理量和基本关系 本节介绍直流电机的静态特性以及动态特性 本节介绍直流电机的控制方法、启动方法、稳定运行条件 本节介绍直流电动机的四种工作状态 本节介绍控制系统中应用的直流电动机的类型 文章目录基础知识基本物理量:电磁转矩与电枢反电势…

将TensorFlow模型快速迁移到昇腾平台

当前业界很多训练脚本是基于TensorFlow的Python API进行开发的,默认运行在CPU/GPU/TPU上,为了使这些脚本能够利用昇腾AI处理器的强大算力执行训练,需要对TensorFlow的训练脚本进行迁移。首先,我们了解下模型迁移的全流程&#xff…

.net6Api返回统一结果+Vue3前端访问

目录 第一种 第二种 第三种 Vue3前端访问 在我们开发api的时候,需要让接口返回统一的接口,这样容易理解,也容易管理。所以封装返回的统一结果是非常必要的。 下面介绍3种方案。 第一种 建立一个控制器,让所有控制器都继承…

电脑休眠唤醒后会出现屏幕闪烁问题怎么彻底解决?

电脑休眠唤醒后会出现屏幕闪烁问题怎么彻底解决?有的用户在电脑待机休眠之后,重新去唤醒电脑使用,这个时候电脑屏幕就会出现验证的屏幕闪烁,导致无法进行正常的使用。这个情况是电脑系统不兼容导致的。如果想要彻底解决问题&#…

NoClassDefFoundError错误解决

NoClassDefFoundError 类型报错 NoClassDefFoundError与ClassNotFoundException略有区别,从两者的异常类型可以发现,前者属于Error,后者属于Exception,发生了Error往往会导致程序直接崩溃或者无法启动运行。 NoClassDefFoundErro…

ecchart关系图展示(知识图谱)

<!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>ECharts 关系图</title><script type"text/javascript" src"http://code.jquery.com/jquery-3.5.1.min.js"></script><script s…

蓝桥杯-迷宫

没有白走的路&#xff0c;每一步都算数&#x1f388;&#x1f388;&#x1f388; 题目描述&#xff1a; 已知一个30行50列的方格&#xff0c;方格由0和1组成&#xff0c;1 表示障碍物&#xff0c;0表示可行的方块。人从最上边开始行走&#xff0c;逃出这个迷宫&#xff0c;走到…

Git 之reflog回滚操作失误

前言 以前只知道有git log命令&#xff0c;并不知道有git reflog。今天一个偶然的机会&#xff0c;我不小心把自己前两天写的代码给整丢了&#xff0c;如果时几个小时的代码&#xff0c;我重新写一遍就算了&#xff0c;但是这次不一样&#xff0c;这次是非常重大的修改&#x…

openfeign集成sentinel实现服务降级

openfeign集成sentinel实现服务降级使用openfeign调用服务&#xff08;不含sentinel&#xff09;代码测试openfeign集成sentinel实现服务降级引入sentinel相关环境编写FeignClient注解接口的实现类在服务提供者中&#xff0c;认为添加异常代码&#xff0c;以供测试 / 或者不启动…

SpringBean的生命周期

下文要讲的均是spring的默认作用域singleton的bean的生命周期&#xff0c;对spring作用域不了解的可以 https://blog.csdn.net/hlzdbk/article/details/128811271?spm1001.2014.3001.5502 什么是SpringBean的生命周期 springBean的生命周期&#xff0c;指的是spring里一个be…

Python爬虫以及数据可视化分析之某站热搜排行榜信息爬取分析

目录前言一&#xff0c;确定目标二&#xff0c;发送请求三, 解析数据四, 保存数据pyecharts进行可视化“某站”数据排名前10视频类型“某站”标题标签可视化“某站”喜欢视频分类概况总结前言 本项目将会对“某站”热搜排行的数据进行网页信息爬取以及数据可视化分析 本教程仅…

数据结构:栈的学习

作者&#xff1a;爱塔居 专栏&#xff1a;数据结构 作者简介&#xff1a;大三学生&#xff0c;希望跟大家一起进步 目录 一、栈 1.1 概念 1.2 栈的使用 1.3 示例 二、栈的应用场景 2.1 改变元素的序列 2.2 逆波兰表达式求值 2.3 括号匹配 2.4 栈的压入、弹出序列 一、栈…

upstream sent duplicate header line: “Transfer-Encoding: chunked“

实际情景&#xff1a; 公司项目有一个下载文件的功能&#xff0c;没有经过Nginx代理之前&#xff0c;好好的&#xff0c;正常下载&#xff1b; 加入了Nginx代理之后&#xff0c;过Nginx访问就会有 err_empty_response 这个错误&#xff1b; 搞了半天&#xff0c;nginx.conf加入…

第一章 linux概述

第一章 Linux概述 1、为什么要使用Linux Linux内核最初只是由芬兰人林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;在赫尔辛基大学上学时出于个人爱好而编写的。 Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和UNIX的多用户、多任务、支…

【蓝桥杯_学习_51单片机】矩阵键盘 状态机法

矩阵键盘 一.基础知识 在键盘中按键数量较多时&#xff0c;为了减少I/O口的占用&#xff0c;通常将按键排列成矩阵形式采用逐行或逐列的“扫描”&#xff0c;就可以读出任何位置按键的状态 矩阵键盘和独立按键一样&#xff0c;也需要进行消抖处理&#xff01; 于此补充一下抖…

c++之基础入门一

一、c的初始化typedef struct student {int age;char name[10];int num; }student;int main() {//在c中可以利用花括号进行初始化struct student student1{12,"zs",123456 };int a 10, b 20;int b{ 20 }, a{ 10 };double c{ 20 };int* p{ nullptr };int arr[10]{ 1…

Day877.数据空洞 -MySQL实战

数据空洞 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于数据空洞的内容。 数据库占用空间太大&#xff0c;把一个最大的表删掉了一半的数据&#xff0c;怎么表文件的大小还是没变&#xff1f; 一个 InnoDB 表包含两部分&#xff0c;即&#xff1a; 表结构定义数…

我通过 tensorflow 预测了博客的粉丝数

前言&#xff1a;由于最近接触了 tensorflow.js&#xff0c;出于试一下的心态&#xff0c;想通过线性回归预测一下博客的粉丝走向和数量&#xff0c;结果翻车了。虽然场景用错地方&#xff0c;但是整个实战方法用在身高体重等方面的预测还是有可行性&#xff0c;所以就记录下来…

亚马逊云科技助力游戏上云学习心得-增长篇

云服务已经是大势所趋了&#xff0c;通过购置传统服务器来进行应用开发&#xff0c;无法与现代化敏捷的开发方法相结合&#xff0c;对于系统运维的难度也大大增加&#xff0c;而云服务的弹性伸缩、动态计费可以很好地帮助中小企业实现快速应用开发&#xff0c;使得产品的价值最…

LeetCode题目笔记——1337. 矩阵中战斗力最弱的 K 行

文章目录题目描述题目难度——简单方法一&#xff1a;暴力&#xff0c;统计代码/Python方法二&#xff1a;优化代码总结彩蛋题目描述 给你一个大小为 m * n 的矩阵 mat&#xff0c;矩阵由若干军人和平民组成&#xff0c;分别用 1 和 0 表示。 请你返回矩阵中战斗力最弱的 k 行…