计算机基础知识35

news2024/11/17 10:05:50

进程和线程的比较

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 n
    temp = n
    time.sleep(0.5)
    n = temp - 1
    lock.release()
from threading import Thread

if __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()

今日思维导图:

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

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

相关文章

“智慧工地”施工现场管理一体化云平台,支持多端展示(PC端、手机端、平板端)

智慧工地平台源码,微服务架构JavaSpring Cloud UniApp MySql 支持多端展示(PC端、手机端、平板端) 智慧工地是什么? 智慧工地主要围绕绿色施工、安全管控、劳务管理、智能管理、集成总控等方面,帮助工地解决运营、管理…

cario库——C++画图

文章目录 RGBA1. 多个(x,y)坐标点,连成线2. 画圆3. 填充颜色4. 曲线图 RGBA rgb:红绿蓝 rgb(0,0,0):黑色rgb(255,255,255):白色 rgba:红绿蓝透明度(0:完全透明,1:完全不…

如何挑选多用户商城源码?

数字化时代,电子商务已经成为了商业发展的重要方向。无论是大型企业还是个人创业者,都希望能够通过搭建一个多用户商城来拓展自己的业务,并与更多的消费者建立联系。 对于大多数人来说,从零开始开发一个多用户商城是一项巨大的挑战…

PTA 小字辈(树)

题目 本题给定一个庞大家族的家谱,要请你给出最小一辈的名单。 输入格式: 输入在第一行给出家族人口总数 N(不超过 100 000 的正整数) —— 简单起见,我们把家族成员从 1 到 N 编号。随后第二行给出 N 个编号&#…

minikube创建一个pod并暴露端口(使用docker驱动安装)

因为minikube使用service暴露端口是使用nodeIP:nodePort 而不是 localhost:nodePort 公开访问。我们只能使用kubectl的端口转发功能或者使用iptables的转发功能来实现外网服务暴露。 我这里使用shiro来举例 apiVersion: apps/v1 kind: Deployment metadata:name: shiro550 spe…

财务对账-财务收发存-业务收发存

务对账是指将公司的账目与银行等第三方提供的相关账单进行核对比对,以确定公司记录的交易是否与银行或其他第三方的记录一致。对账的具体步骤通常包括以下几个方面: 收集资料:首先需要收集公司的财务记录,包括公司银行账户的流水…

学员分享| 一个普通学员的HCIE-DATACOM备考之路!

大家好,我是G-LAB IT实验室的周同学,在这篇文章中,我将分享我的备考HCIE数通方向的心路历程。我的备考之路👇 ——备考理论—— 我从一年前开始了HCIE数通方向的备考。一开始,我并没有完全了解这个认证的难度和复杂性…

免费Scrum管理工具-Leangoo领歌

Leangoo领歌是一款永久免费的专业的敏捷开发管理工具,提供端到端敏捷研发管理解决方案,涵盖敏捷需求管理、任务协同、进展跟踪、统计度量等。 
 Leangoo领歌上手快、实施成本低,可帮助企业快速落地敏捷,提质增效、缩短周期、加速…

vue 插槽-默认插槽

vue 插槽-默认插槽 **创建 工程: H:\java_work\java_springboot\vue_study ctrl按住不放 右键 悬着 powershell H:\java_work\java_springboot\js_study\Vue2_3入门到实战-配套资料\01-随堂代码素材\day05\准备代码\07-插槽-默认插槽 vue --version vue create…

CMMI软件能力成熟度认证指南来了

CMMI能力成熟度模型集成,是一种评估或认证体系。其核心理念是:过程决定质量,这六个字能够让大家对CMMI有了一个大概的了解。是的,重点是过程,CMMI评估的核心内容也是过程。主要是CMMI研究院主任评估员根据CMMI模型检查…

torch版本对应的torch_geometric与torch-sprse/cluster/scatter库的正确安装

torch_geometric官网: Installation — pytorch_geometric documentation 使用上述标红命令即可快速安装需要的包(确定自己环境中安装的pytorch版本以及cuda版本,使用对应的命令即可) 如安装的pytorch为1.60,cuda为1…

10款远程办公软件,助你事半功倍,晋升快如闪电

选择一个易于使用和方便的远程软件,可以提高团队的整体效率,减少加班,使整个团队更受益。互联网行业从产品经理、UI/从UX设计师到技术开发和测试人员,每一个环节都需要密切沟通和跟踪,在远程沟通中及时发现问题&#x…

广东广西大量工地建筑支模

近年来,广东广西地区的建筑工地发展迅猛,为满足日益增长的建筑需求,大量工地都需要使用支模模板。支模模板是建筑施工中不可或缺的重要工具,用于搭建楼层、梁柱等结构的模板系统。在广东广西,有许多专业的支模模板厂家…

万物归宗系列01-html基本语法

万物归宗系列&#xff0c;即什么都懂一点系列。 HTML是标签语言&#xff0c;一般成双成对。 Hypertext Markup Language&#xff1a;超⽂本标记语⾔。是⽤来制作⽹页的⼀种标记语⾔。 1 基本框架 <!DOCTYPE html> <html lang"en"> <head><meta…

DAC8563数模转换模块的使用介绍

前言 DAC8563为16位低功耗、电压输出、双通道的数模转换器&#xff0c;其包括一个2.5V4ppm/C 内部基准&#xff0c;从而提供了一个 2.5V 或 5V 的满量程输出电压范围。 此内部基准有一精度&#xff0c;并且能够在 VREFIN/VREFOUT引脚上提供或吸收高个 5mV 的初始达 20mA 的电流…

【75. 颜色分类】

目录 一、题目描述二、算法思想三、代码实现 一、题目描述 二、算法思想 三、代码实现 class Solution { public:void sortColors(vector<int>& nums) {int nnums.size();for(int left-1,rightn,i0;i<right;){if(nums[i]0)swap(nums[i],nums[left]);else if(nums…

7+非肿瘤+WGCNA+分型+实验,筛选关键基因进一步分型以及表达验证

今天给同学们分享一篇非肿瘤WGCNA分型实验的生信文章“Identification of molecular subtypes and immune infiltration in endometriosis: a novel bioinformatics analysis and In vitro validation”&#xff0c;这篇文章于2023年8月18日发表在Front Immunol期刊上&#xff…

Net6集成Nacos实现服务注册

Net6集成Nacos实现服务注册 一、服务注册1.创建WebAPI项目2.安装Nuget包3.注册NacosNacos配置文件&#xff08;放在Appsetting.json或其他文件中&#xff09;4.创建Api控制器5.运行效果 二、配置中心1.设置配置2.读取配置3.展示效果4.设置多个配置项 Nacos安装 nacos-sdk-cshar…

Java自定义线程池

一、线程池的概念和作用 线程池是一种用于管理和重用线程的机制。它允许你创建一个线程池&#xff0c;然后将任务提交给这个线程池&#xff0c;线程池会自动分配线程来执行这些任务。 线程池的作用是优化线程的管理和资源利用&#xff0c;以减少线程创建和销毁的开销&#xff0…

竞赛选题 深度学习交通车辆流量分析 - 目标检测与跟踪 - 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; *…