详解Python进程与线程

2023-11-08

一、进程

1. 1 进程概念

进程是资源分配的最小单位,程序隔离的边界。

CPU的时间片轮转,在不同的时间段切换执行不同的进程,但是切换进程是比较耗时的;就引来了轻量级进程,也就是所谓的线程,一个进程中包括多个线程(代码流,其实也就是进程中同时跑的多个方法体)

程序:例如xxx.py这是程序,是一个静态的

进程:一个程序运行起来后,代码+用到的资源 称之为进程,它是操作系统分配资源的基本单元

2.2 进程的状态

工作中,任务数往往大于cpu的核数,即一定有一些任务正在执行,而另外一些任务在等待cpu进行执行,因此导致了有了不同的状态。

  • 就绪态:运行的条件都已经满足,正在等在cpu执行
  • 执行态:cpu正在执行其功能
  • 等待态:等待某些条件满足,例如一个程序sleep了,此时就处于等待态

进程的创建-multiprocessing

1. 创建子进程

说明

创建子进程跟创建线程十分类似,只需要传入一个执行函数和函数的参数,创建一个Process实例,用start()方法启动

Process语法结构如下:

Process([group [, target [, name [, args [, kwargs]]]]])

  • target:如果传递了函数的引用,这个子进程就执行这里(函数)的代码
  • args:给target指定的函数传递的参数,以元组的方式传递
  • kwargs:给target指定的函数传递命名参数
  • name:给进程设定一个名字,可以不设定
  • group:指定进程组,大多数情况下用不到

Process创建的实例对象的常用方法:

  • start():启动子进程实例(创建子进程)
  • is_alive():判断进程子进程是否还在活着
  • join([timeout]):是否等待子进程执行结束,或等待多少秒
  • terminate():不管任务是否完成,立即终止子进程

Process创建的实例对象的常用属性:

  • name:当前进程的别名,默认为Process-N,N为从1开始递增的整数
  • pid:当前进程的pid(进程号)

二、线程

2.1 线程概念

线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。

主线程:

当一个程序启动时,就有一个进程被操作系统(OS)创建,与此同时一个线程也立刻运行,该线程通常叫做程序的主线程。

主线程的重要性有两⽅⾯:
1)是产⽣其他⼦线程的线程;
2)通常它必须最后完成执⾏⽐如执⾏各种关闭动作。

子线程

可以看做是程序执行的一条分支,当子线程启动后会和主线程一起同时执行

1. 单线程执行

运行结果:

2. 使用threading模块 创建子线程

python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便的被使用

2.1 核心方法

  • threading.Thread(target=函数名) threading模块的Thread类 创建子线程对象
  • 线程对象 .start() 启动子线程

2.2 代码实现

运行结果:

说明

  • 1. 可以明显看出使用了多线程并发的操作,花费时间要短很多
  • 2. 当调用 start() 时,才会真正的创建线程,并且开始执行
  • 3. 每个线程都有一个唯一标示符,来区分线程中的主次关系
  • 4. 主线程:mainThread,Main函数或者程序主入口,都可以称为主线程
  • 5. 子线程:Thread-x 使用 threading.Thread() 创建出来的都是子线程
  • 6. 线程数量:主线程数 + 子线程数

3. 主线程会等待所有的子线程结束后才结束

三、进程、线程对比

目标

  • 知道多进程和多线程的区别

3.1 功能

进程,能够完成多任务,比如 在一台电脑上能够同时运行多个QQ

线程,能够完成多任务,比如 一个QQ中的多个聊天窗口

3.2 使用区别

  • 进程是系统进行资源分配和调度的一个独立单位
  • 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属同一个进程的其他的线程共享进程所拥有的全部资源
  • 一个程序至少有一个进程,一个进程至少有一个线程
  • 线程的划分尺度小于进程(资源比进程少),使得多线程程序的并发性高
  • 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率

  • 线程不能够独立执行,必须依存在进程中
  • 可以将进程理解为工厂中的一条流水线,而其中的线程就是这个流水线上的工人

3.3 进程与线程的选择取决以下几点:

  • 需要频繁创建销毁的优先使用线程;因为对进程来说创建和销毁一个进程代价是很大的。
  • 线程的切换速度快,所以在需要大量计算,切换频繁时用线程,还有耗时的操作使用线程可提高应用程序的响应
  • 因为对CPU系统的效率使用上线程更占优,所以可能要发展到多机分布的用进程,多核分布用线程;
  • 并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求;
  • 需要更稳定安全时,适合选择进程;需要速度时,选择线程更好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

详解Python进程与线程 的相关文章

随机推荐

  • 提升布局灵活性:掌握Vue中vue-splitpane分割面板的实用技巧

    项目中遇到内容分割化并且可以让用户自行调整面板大小的需求 即可使用此组件解决 首先看效果 使用 npm install vue splitpane S 引入组件库 import splitPane from vue splitpane 全局
  • Altium Designer中批量修改原理图中的器件属性

    网上关于批量修改也有很多的介绍 按照网上的尝试在PCB的修改中可以正常操作 但是在原理图中 却只能修改一个 究其原因 原来是差了一步 正确的步骤是 1 先选择需要修改的器件的其中一个 2 右键find similar objects 然后在
  • 史上最全的Unity面试题(含答案)

    一 什么是渲染管道 是指在显示器上为了显示出图像而经过的一系列必要操作 渲染管道中的很多步骤 都要将几何物体从一个坐标系中变换到另一个坐标系中去 主要步骤有 本地坐标 gt 视图坐标 gt 背面裁剪 gt 光照 gt 裁剪 gt 投影 gt
  • scrapy爬取动态网页_基于scrapy的动态网页采集方案总结

    基于scrapy的动态网页采集一直是个难点 而且如果想达到工程级别的抓取 需要有个高效率的解决方案 我列出了几个曾经尝试过的方案和它们的特点 基于PyV8等脚本解析引擎 这类方案的原理是利用开源浏览器项目中的脚本解释引擎 实现相关脚本片段的
  • unity 切换camera 渲染层

    camera有个属性cullingMask 改变cullingMask就可以改变camera渲染层 在做GUI时特别有用 camera cullingMask 1 lt lt 8 渲染除了层8的所有层 camera cullingMask
  • Redis生存时间TTL

    文章目录 为什么要设置key生存时间 设置key的生存时间 访问key的生存时间 清除生存时间 毫秒级时间 为什么要设置key生存时间 设置key的生存时间 可以用于以下使用场景 在登录网站后 将用户session存储在内存 设置一个过期时
  • Second season fifteenth episode,How are Ross and Rachel doing

    Scene Chandler and Joey s apartment Joey and Chandler enter with Chandler covering his eyes and Joey leading him JOEY Al
  • y2第一章 初始mybatis的上机3_MyBatis3.2.x从入门到精通之第一章

    第一章 一 引言 mybatis是一个持久层框架 是apache下的顶级项目 mybatis托管到goolecode下 再后来托管到github下 百度百科有解释 二 概述 mybatis让程序将主要精力放在sql上 通过mybatis提供
  • 改进遗传算法的参数反演--实例复现(详细注释)

    目录 主函数 计算适应度大小 选择操作 论文中的竞争选择法 锦标赛选择法 交叉操作 论文中的离散交叉法 变异操作 论文中的非均匀变异法 生成测试数据 某次运行结果 主函数 清除变量 导入数据 clear clc load Data Crea
  • hihoCoder_1014

    include
  • 以 Animated Drawings APP 为例,用 TorchServe 进行模型调优

    内容导读 上节介绍了 TorchServe 模型部署调优的 5 个步骤 将模型部署到生产环境中 本节以 Animated Drawings APP 为例 实际演示 TorchServe 的模型优化效果 本文首发自微信公众号 PyTorch
  • C++中报错: E0289:没有与参数列表匹配的构造函数“Employee::Employee”实例的解决方案

    仅为学习笔记 大佬请跳过 解决 将构造函数代码中的char pName改为const char pName即可 背景 构造函数等成员函数全部都写了 仍出现这个报错 解决 将构造函数代码中的char pName改为const char pNa
  • 【机器学习期末总结】5-感知机

    分离超平面 随机梯度下降 对偶形式 感知机简介 感知机1957年由Rosenblatt提出 是神经网络与支持向量机的基础 感知机是二类分类的线性分类模型 输入是实例的特征向量 输出是实例的类型 1 1 感知机模型是一个分离超平面 感知机预测
  • Linux crontab命令 定时任务 用法详解以及no crontab for root解决办法

    一 Linux系统安装crontab服务 1 确认crontab是否安装 crontab l 如果报 command not found 就说明该crontab服务没有安装 如果报 no crontab for root 就说明已经安装cr
  • python------线程池的应用

    在python中经常会使用异步 线程池 进程池 解决io操作 在爬虫中并不建议使用进程池 消耗过大 目标 会使用线程池 1 导入 import time def demo1 for i in range 3 print f 我饿了 i ti
  • MVCC与BufferPool缓存机制

    今天学习了MVCC与BufferPool缓存机制 这里记录一下学习笔记 有错误 还望指出 文章目录 MVCC多版本并发控制机制 undo日志版本链与read view机制 Innodb引擎SQL执行的BufferPool缓存 MVCC多版本
  • 《前端》jQuery-ajax例子

    我的jQuery ajax的笔记 https blog csdn net bellediao article details 104239715 从其他博主那里截取的例子 并附有疑问解答 例1 将接口中的result字段绘制成表格
  • Windows官方Linux子系统C/C++开发环境搭建

    关于利用 Windows 10 适用于 Linux 的 Windows 子系统 WSL 安装 Linux 在 Windows 平台直接运行而不依赖虚拟机并通过 Visual Studio Code 在 Windows 平台直接开发并调试Li
  • 搜索+防抖

    搜索 防抖 1 以每时每刻这个项目为例 很多页面都有搜索功能 而且跳转的时同一个搜索页面 在完成搜索功能后 在返回原页面 需要一个唯一标识来记载 搜索 goSearch this router push path search query
  • 详解Python进程与线程

    一 进程 1 1 进程概念 进程是资源分配的最小单位 程序隔离的边界 CPU的时间片轮转 在不同的时间段切换执行不同的进程 但是切换进程是比较耗时的 就引来了轻量级进程 也就是所谓的线程 一个进程中包括多个线程 代码流 其实也就是进程中同时