当前位置: 首页 > news >正文

计算机基础知识35

进程和线程的比较

1. 进程的开销比线程的开销大很多
2. 进程之间的数据是隔离的,但是,线程之间的数据不隔离
3. 多个进程间的线程数据不共享----->让进程通信(IPC)---->进程下的线程也通信了---->队列

GIL全局解释器锁(重要理论)

# 虽然一个进程中开了多个线程,但在同一时刻只有一个线程在解释器中运行,全局解释器     锁(GIL)来保证

# 背景信息:

     1、Python代码运行在解释器上嘛,有解释器来执行或者解释

      2、 Python解释器的种类:CPython、IPython、PyPy、Jython、IronPython

                                                    官方下载  交互式   提高速度  Java字节码
     3. 当前市场使用的最多(95%)的解释器就是CPython解释器
     4. GIL全局解释器锁是存在于CPython中
     5. 同一时刻只有一个线程在执行,GIL全局解释器锁是为了避免多个线程抢夺资源的情况

# 在设计之初,在解释器上添加了一把锁  GIL

       哪个线程想执行,必须拿到这把锁,等释放掉,别的线程才能拿

## 问题:

     1. python有GIL锁的原因,同一个进程下多个线程,实际上同一时刻只有一个线程在执行
     2. 只有在python上开进程用的多,其他语言一般不开多进程,只开多线程就够了
     3. cpython解释器开多线程不能利用多核优势,只有
开多进程才能利用多核优势,其他语               言不存在这个问题
     4. 8核cpu电脑,充分利用起我这个8核
     5. 如果不存在GIL锁,一个进程下,开启8个线程,它就能够充分利用cpu资源,跑满cpu
     6. cpython解释器中好多代码,模块都是基于GIL锁机制写起来的,改不了了----》开启多            进程---》每个进程下开启的线程,可以被多个cpu调度执行
     7. cpython解释器:
io密集型使用多线程,计算密集型使用多进程

互斥锁

"""在多线程的情况下,同时执行一个数据,会发生数据错乱的问题"""

n = 10
from threading import Lock
import time
def task(lock):lock.acquire()global ntemp = ntime.sleep(0.5)n = temp - 1lock.release()
from threading import Threadif __name__ == '__main__':tt = []lock=Lock()for i in range(10):t = Thread(target=task, args=(lock, ))t.start()tt.append(t)for j in tt:j.join()print("主", n)

# 拿时间换空间,空间换时间 时间复杂度

# 面试题:既然有了GIL锁,为什么还要互斥锁? (多线程下)

     1. 第一个线程来了,拿到a=0,开始执行a=a+1,这个时候结果a就是1了
     2. 第一个线程得到的结果1还没有赋值回去给a,这个时候,第二个线程来了,拿到的a是             0,继续执行, a=a+1结果还是1
     3. 加了互斥锁,就能够解决多线程下操作同一个数据,发生错乱的问题

# 线程执行过快,还未赋值,下一个线程就上来了,所以加个互斥锁

    GIL锁同时只能执行 一 个线程

线程队列

# 队列可以解决数据隔离问题(进程)

   队列可以保持数据的安全(线程)

# 线程队列:1. 先进先出     2. 后进先出       3. 优先级的队列

"""进程"""
from multiprocessing import Queue
"""线程"""
import queue
queue.Queue()

# queue.Queue的缺点是它的实现涉及多个锁和条件变量,因此可能会影响性能和内存效率

"""先进先出"""
import queue
q=queue.Queue()  # 无限大、
q.put('first')
q.put('second')
print(q.get())
print(q.get())
"""后进先出"""
import queue
# Lifo:last in first out
q=queue.LifoQueue()
q.put('first')
q.put('second')
print(q.get())
print(q.get())
"""优先级队列"""
import queue
q=queue.PriorityQueue()
q.put((20,'a'))   # put进入一个元组,元组的第一个元素是优先级,数字越小优先级越高
q.put((10,'b'))
q.put((30,'c'))
print(q.get())    # 数字越小优先级越高,优先级高的优先出队
print(q.get())
print(q.get())

进程池和线程池的使用(concurrent模块)

# 池:池子、容器类型,可以盛放多个元素

# 进程池:提前定义好一个池子,然后,往这个池子里面添加进程,以后,只需要往这个进     程池里面丢任务就行了,然后,有这个进程池里面的任意一个进程来执行任务

# 线程池:由任意一个线程来执行任务

# 开进程池

def task(n, m):return n+m
def task1():return {'username':'kevin', 'password':123}from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
def callback(res):print(res) # Future at 0x1ed5a5e5610 state=finished returned int>print(res.result()) # 3
def callback1(res):print(res) # Future at 0x1ed5a5e5610 state=finished returned int>print(res.result()) # {'username': 'kevin', 'password': 123}print(res.result().get('username'))if __name__ == '__main__':pool=ProcessPoolExecutor(3)   # 定义一个进程池,里面有3个进程# pool=ThreadPoolExecutor(3)  改一下就是线程pool.submit(task, m=1, n=2).add_done_callback(callback)   ## 2. 往池子里面丢任务pool.submit(task1).add_done_callback(callback1)

# 回调函数,等执行回调用这个函数

# 拿结果:print(res.result())

进程池中先主后子,如果想子进程都执行完再执行主进程:

pool.shutdown()    # join + close
print(123)

协程理论

# 进程:资源分配的基本单位
    线程: 执行的最小单位
    协程:是程序员自己想出来的,不存在于操作系统中
    并发:切换+保存状态

# 协程就是单线程下的并发   # 遇到I/O时

# 协程是最节省资源的,进程是最消耗资源的,其次是线程

   监测有没有遇到IO,本质上就是最大限度的利用CPU资源

            import gevent 模块      先安装,不是内置:pip install gevent 

猴子补丁:就可以把gevent.sleep(2) 写成time.sleep(2)

from gevent import monkey;
monkey.path_all()
gevent.joinall([g1,g2])
# 相当于g1.join()   g2.join()

今日思维导图:

相关文章:

计算机基础知识35

进程和线程的比较 1. 进程的开销比线程的开销大很多 2. 进程之间的数据是隔离的,但是,线程之间的数据不隔离 3. 多个进程间的线程数据不共享----->让进程通信(IPC)---->进程下的线程也通信了---->队列 GIL全局解释器锁(重要理论) # 虽然一个进程…...

VulnHub mrRobot

一、信息收集 1.访问地址 没啥信息,尝试扫下目录 2.目录扫描 key1 发现有wp-admin/和robots.txt robots.txt里面还拿到了一个密码字典,猜测是爆破wp的网站账号密码的 3.访问wp-admin/ ┌──(root💀kali)-[~/桌面] └─# sort -u fsoci…...

【MATLAB第79期】基于MATLAB的数据抽样合集(sobol、LHS、Halton、正交、随机函数)更新中

【MATLAB第79期】基于MATLAB的数据抽样合集(sobol、LHS、Halton、正交、随机函数)更新中 一、随机函数 1.指定区间随机生成数据(小数) [a b]区间随机数生成: Aa(b-a)rand(m,n) m:待生成矩阵A的行数 n: 待生成矩阵A…...

Lua快速入门教程

文章目录 1、Linux安装Lua2、语法练习2.1、变量2.2、循环2.3、函数2.4、数组2.5、迭代器2.6、Table操作2.7、Lua 模块与包2.8、加载机制2.9、Lua 元表(Metatable) 3、Lua 协同程序(coroutine)4、文件IO操作4.1、简单模式4.2、完全模式 5、错误处理 内容来源菜鸟教程&#xff0c…...

html资源提示符

前言&#xff1a;正常dom解析 中遇到script标签 &#xff0c;会暂停主线程 去下载js&#xff0c;拿到资源后&#xff0c;主线程再执行js。 那么主线程在等待网络线程下载这个空闲很浪费 解决方案&#xff1a; script标签增加属性 async defer 1.async <script src"./i…...

VR智能家居虚拟连接仿真培训系统重塑传统家居行业

家居行业基于对场景的打造及设计&#xff0c;拥有广阔前景&#xff0c;是众多行业里面成为最有可能进行元宇宙落地的应用场景之一。 家居行业十分注重场景的打造及设计&#xff0c;而元宇宙恰恰能通过将人工智能、虚拟现实、大数据、物联网等技术融合提升&#xff0c;带来身临其…...

Defects4j数据集安装及使用

0、常见问题 1. 所有配置完成后运行defects4j info -p Lang测试出现错误 Cant locate DBI.pm in INC (you may need to install the DBI module) (INC contains: /myproject/defects4j/framework/lib /myproject/defects4j/framework /myproject/defects4j/framework/core /m…...

vant_ CountDown倒计时

语法可以直接在官网查看 需求 后端返回的数据格式如下 [{"id": 1,"btn_text": "1","second": 0},{"id": 2,"btn_text": "1","second": 0}... ]之前约定second最多30s&#xff0c; 因此只需…...

spark集成hive

集群使用ambarihdp方式进行部署,集群的相关版本号如下所示: ambari版本 Version 2.7.4.0 HDP版本 HDP-3.1.4.0 hive版本 3.1.0 spark版本 2.3.0 集群前提条件: 1.Hdp、Spark、Hive都已部署好 2.Hive数据层建好&#xff0c;在Hdfs生成相应各层目录&#xff0c;后面配…...

提升微服务稳定性与性能:深入剖析Netflix Hystrix框架

说到 Netflix Hystrix 框架&#xff0c;一定离不开 com.netflix.hystrix.HystrixCommand&#xff0c;这个类是 Netflix 开源的 Hystrix 框架中的一个关键类&#xff0c;用于实现服务的容错和熔断功能。它主要用于将远程服务调用封装成一个独立的命令对象&#xff0c;以便于进行…...

IT运维管理系统在国有大型企业网络中的应用和可以解决的问题

随着国有大型企业业务的快速发展&#xff0c;网络运维管理面临着诸多挑战。本文将从问题概述、解决方案、监控易优势、实际案例和总结等方面阐述IT运维管理系统在国有大型企业网络中的应用和可以解决的问题。​IT运维管理系统&#xff1a;国有大型企业网络的变革者与解决之道 一…...

嵌入式实时操作系统的设计与开发 (线程操作学习)

在aCoral操作系统中&#xff0c;线程退出采用了和Linux一样的方式&#xff0c;线程函数不用死等或显示调用退出相关函数&#xff0c;也就是说用户不用担心函数执行完后的事情。 uc/OS II任务函数与退出 void test(void *ptr){Do_something();while(1); }void test(void *ptr)…...

竞赛 深度学习交通车辆流量分析 - 目标检测与跟踪 - python opencv

文章目录 0 前言1 课题背景2 实现效果3 DeepSORT车辆跟踪3.1 Deep SORT多目标跟踪算法3.2 算法流程 4 YOLOV5算法4.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; *…...

【RTOS学习】同步与互斥 | 队列

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《RTOS学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 同步与互斥 | 队列 &#x1f349;同步与互斥&#x1f366;同步&#x1f366;互斥 &#x1f349;队…...

Python订单生成器+队列+异步提高性能和容错

以下代码实现了一个订单生成器&#xff0c;使用 asyncio 和 aioredis 库实现了高并发地生成订单&#xff0c;并将新增订单异步更新到数据库。具体实现流程如下&#xff1a; 初始化 OrderGenerator 类。传入 Redis 服务器地址和并发数&#xff0c;在初始化函数中设置并发数和一…...

理德名人故事:全球投资之父-约翰.邓普顿

说到约翰‧邓普顿&#xff0c;我们就会想到他的很多标签。比如全球投资之父、史上最成功的基金经理等等。他是邓普顿集团的创始人&#xff0c;一直被誉为全球最具智慧以及最受尊崇的投资者之一。福布斯资本家杂志称他为"全球投资之父"及"历史上最成功的基金经理…...

微前端三:qiankun 协作开发和上线部署

我们先看qiankun怎么上线部署&#xff1a; 我这边用的是yaml 文件在 rancher上部署的&#xff1a; base是基座&#xff0c;这里每个应用都是一个服务&#xff0c;这个还是跟之前一样并没有区别&#xff0c;那如何在一个域名上挂载多个服务呢&#xff1f; 最开始我们主要是在in…...

HTML三叉戟,标签、元素、属性各个的意义是什么?

&#x1f31f;&#x1f31f;&#x1f31f; 专栏详解 &#x1f389; &#x1f389; &#x1f389; 欢迎来到前端开发之旅专栏&#xff01; 不管你是完全小白&#xff0c;还是有一点经验的开发者&#xff0c;在这里你会了解到最简单易懂的语言&#xff0c;与你分享有关前端技术和…...

prometheus获取kubelet接口监控数据

一、前言 k8s集群的kubelet服务内部有自带的cadvisor服务用于收集k8s集群的监控数据&#xff0c;所以可以通过调用kubelet的接口就能获取pod的资源监控数据&#xff0c;在新版本的k8s中&#xff0c;kubelet的监控数据获取端口为10250端口&#xff0c;老版本的是10255端口 二、…...

国产主控应用案例:汉王电子血压计-君正开发板

2023春季新品发布会上汉王科技发布柯氏音法电子血压计产品—汉王电子血压计&#xff0c;继嗅觉检测盒之后再次深度布局大健康领域。 不同于当前市面上使用示波法原理的电子血压计&#xff0c;汉王电子血压计采用血压测量金标准中的柯氏音法&#xff0c;由此引领一场电子血压计领…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

es6+和css3新增的特性有哪些

一&#xff1a;ECMAScript 新特性&#xff08;ES6&#xff09; ES6 (2015) - 革命性更新 1&#xff0c;记住的方法&#xff0c;从一个方法里面用到了哪些技术 1&#xff0c;let /const块级作用域声明2&#xff0c;**默认参数**&#xff1a;函数参数可以设置默认值。3&#x…...

人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型

在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重&#xff0c;适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解&#xff0c;并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...

内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献

Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译&#xff1a; ### 胃肠道癌症的发病率呈上升趋势&#xff0c;且有年轻化倾向&#xff08;Bray等人&#xff0c;2018&#x…...