OAuth协议详解
一、基本概念
OAuth(Open Authorization)是一种授权协议,用于允许第三方应用程序以受信任的方式访问用户的资源,而无需共享用户的身份验证凭据。OAuth协议的核心目标是在保持用户数据安全的前提下,简化用户在不同应用之间的认证流程。通过OAuth,用户只需在授权服务器上进行一次身份验证,然后授权服务器会生成一个访问令牌(Access Token),第三方应用程序可以使用这个令牌在资源服务器上获取用户数据,而无需知道用户的登录密码。
二、版本及区别
OAuth1.0和OAuth2.0是OAuth协议的两个不同版本,它们在安全性、简单性、互操作性等方面存在显著区别;本文介绍的2.0版本。
1、安全性
- OAuth1.0:存在一些安全漏洞,如会话固化攻击。尽管在OAuth1.0a版本中通过预定义callback和oauth_verifier参数增强了安全性,但它仍然依赖于签名机制来确保请求的安全性和完整性。
- OAuth2.0:在安全性方面进行了显著的改进。它引入了访问令牌的有效期、刷新令牌、访问范围的定义等新特性,使得授权管理更加灵活和安全。此外,OAuth2.0要求使用HTTPS协议进行通信,以确保数据在传输过程中的安全性。这些改进使得OAuth2.0在安全性方面相比OAuth1.0有了显著的提升。
2、简单性
- OAuth1.0:交互过程相对复杂,涉及多个步骤和参数,如请求令牌(Request Token)、访问令牌(Access Token)的交换等。这增加了开发和部署的复杂性。
- OAuth2.0:关注客户端开发者的简易性,简化了认证和授权流程。它引入了客户端凭证和授权码等新的授权类型,使得整个流程更加简单和直观。此外,OAuth2.0还提供了多种授权模式以适应不同的应用场景和需求,进一步降低了开发和部署的难度。
3、互操作性
- OAuth1.0:虽然为Web应用提供了一种简单的授权方式,但在不同平台上的应用互操作性方面存在限制。
- OAuth2.0:为Web应用、桌面应用、手机应用以及智能家居设备等多种平台提供了专门的认证流程。这使得在不同平台上的应用都可以使用OAuth协议进行授权,提高了互操作性。
4、兼容性
- OAuth1.0:与OAuth2.0不兼容。这意味着如果企业需要从OAuth1.0迁移到OAuth2.0,需要进行大量的改动和调整。
- OAuth2.0:是一个全新的协议版本,不兼容OAuth1.0。然而,由于其在安全性、简单性和互操作性方面的优势,OAuth2.0已经成为目前广泛使用的版本。
5、总体对比
OAuth1.0 | OAuth2.0 | |
---|---|---|
安全性 | 存在安全漏洞,如会话固化攻击 | 通过引入新的安全特性提高了安全性 |
简单性 | 交互过程复杂,涉及多个步骤和参数 | 简化了认证和授权流程,降低了开发和部署的难度 |
互操作性 | 在不同平台上的应用互操作性存在限制 | 为多种平台提供了专门的认证流程,提高了互操作性 |
兼容性 | 与OAuth2.0不兼容 | 是一个全新的协议版本,不兼容OAuth1.0 |
应用场景 | 逐渐被淘汰,但在一些老旧系统中可能仍然在使用 | 适用于各种现代应用场景,如第三方登录、API授权等 |
三、工作原理
OAuth协议的工作原理类似于用户委托“令牌”的方式,使得用户可以向第三方应用程序授予对自己资源的访问权限,同时又保护了用户的身份信息。以下是OAuth协议的基本工作流程:
- 用户向应用程序发出请求:用户向第三方应用程序发出请求,要求访问其保护的资源。
- 重定向到授权服务器:应用程序会将用户重定向到授权服务器,并带上一些必要的参数,例如应用程序ID、请求的范围、回调地址等。
- 用户授权:用户在授权服务器登录并批准应用程序对其资源的访问请求。
- 颁发访问令牌:授权服务器向应用程序颁发访问令牌(Access Token)和更新令牌(Refresh Token)等凭证。
- 访问受保护资源:应用程序使用访问令牌访问受保护的资源。
- 刷新令牌:如果访问令牌过期,应用程序可以使用更新令牌来获取新的访问令牌。
四、主要角色
在OAuth协议中,主要涉及以下四个角色:
1. 客户端(Client):
指想要访问受保护资源的第三方应用程序。
2. 授权服务器(Authorization Server):
用于颁发访问令牌和更新令牌等凭证的服务器,通常由资源提供方维护。
3. 资源所有者(Resource Owner):
资源所有者是拥有受保护资源的用户或实体。
4. 资源服务器(Resource Server):
存储用户数据,并根据访问令牌提供数据访问权限的服务器。
四、授权模式
OAuth协议支持多种授权模式,以适应不同的场景和应用需求。以下是几种常见的授权模式:
1. 授权码模式(Authorization Code Grant):
- 用户向客户端发送访问受保护资源的请求。
- 客户端将用户重定向到授权服务器,并带上必要的参数。
- 用户在授权服务器登录并批准访问请求。
- 授权服务器向客户端发送一个授权码(Authorization Code)。
- 客户端使用授权码向授权服务器请求访问令牌。
- 授权服务器向客户端颁发访问令牌和更新令牌。
这种模式是最常用的流程,安全性也最高,适用于那些有后端的Web应用。授权码通过前端传送,令牌则是储存在后端,而且所有与资源服务器的通信都在后端完成。这样的前后端分离,可以避免令牌泄漏。
2. 隐式授权模式(Implicit Grant):
- 用户向客户端发送访问受保护资源的请求。
- 客户端将用户重定向到授权服务器,并带上必要的参数。
- 用户在授权服务器登录并批准访问请求。
- 授权服务器直接向客户端颁发访问令牌(不通过授权码)。
这种模式适用于没有后端的客户端应用,如移动应用或JavaScript客户端。由于访问令牌直接通过浏览器返回给客户端,因此安全性相对较低。
3. 密码模式(Resource Owner Password Credentials Grant):
- 用户直接将用户名和密码提供给客户端。
- 客户端使用用户名和密码向授权服务器请求访问令牌。
- 授权服务器验证用户名和密码后,向客户端颁发访问令牌。
这种模式适用于用户高度信任客户端的情况,但存在安全风险,因为用户的密码会被客户端知道。
4. 客户端模式(Client Credentials Grant):
- 客户端使用自己的客户端ID和客户端密钥向授权服务器请求访问令牌。
- 授权服务器验证客户端ID和客户端密钥后,向客户端颁发访问令牌。
这种模式适用于客户端自己需要访问受保护资源的情况,而无需用户参与。
五、应用场景
OAuth协议在现代互联网应用程序中得到了广泛的应用,以下是几个典型的应用场景:
- 第三方应用访问用户在其他服务上的信息:例如,一个应用通过OAuth 2.0访问用户在github.com上的数据。
- 第三方应用代表用户执行操作:例如,一个邮件客户端应用通过OAuth 2.0发送用户的电子邮件。
- 第三方应用实现用户的单点登录:例如,用户可以使用Github账号登录其他应用。
- 原生app授权:app登录请求后台接口,为了安全认证,所有请求都带token信息,如登录验证、请求后台数据等。
- 前后端分离单页面应用:前后端分离框架,前端请求后台数据,需要进行oauth2安全认证。
六、优缺点
优点:
- 安全性高:OAuth协议不会泄露用户的密码等凭据信息,而是通过颁发令牌来实现授权。
- 灵活性高:OAuth协议支持多种授权模式,可以适应不同的场景和应用需求。
- 用户体验好:用户只需在授权服务器上进行一次身份验证,就可以授权多个应用程序访问其资源,简化了认证流程。
- 易于实现和维护:OAuth协议是一个开放标准,业界提供了多种实现方式,如PHP、JavaScript、Java、Ruby等语言开发包,方便开发者使用。
缺点:
- 复杂性:OAuth协议涉及多个角色和多个步骤,实现起来相对复杂。
- 兼容性和互操作性差:由于OAuth协议框架太宽泛,不同实现的兼容性和互操作性可能存在问题。
- 安全风险:虽然OAuth协议提高了安全性,但如果实现不当或存在漏洞,仍然可能存在安全风险。
七、示例
假设有一个第三方应用程序A,想要访问用户在服务B上的数据。以下是使用OAuth 2.0进行第三方登录的流程:
- 用户向应用程序A发送请求:用户想要使用服务B的账号登录应用程序A。
- 重定向到授权服务器:应用程序A将用户重定向到服务B的授权服务器,并带上必要的参数(如应用程序ID、回调地址等)。
- 用户授权:用户在授权服务器登录并批准应用程序A访问其数据。
- 颁发访问令牌:授权服务器向应用程序A颁发访问令牌。
- 访问受保护资源:应用程序A使用访问令牌访问服务B上的用户数据。
图表1:OAuth 2.0授权码模式流程图
+----------+
| Client |
+----------+|| +----------------+| | User-Agent || +-------+--------+| |V V
+----------+ +---------------+
| Resource |<-------| Authorization |
| Owner | | Server |
+----------+ +---------------+^ ^| |(C) || +---------+| | User- || | Agent || | Redirect|| +---------+| || Authorization| Code GrantV
+----------+ +---------------+
| Client |<---------| Authorization |
| | | Server |
+----------+ +---------------+^ || +-------+--------+| | Access || | Token |V +-----------+
+----------+ |
| Resource |<-------------+
| Server |
+----------+
八、结论
OAuth协议为用户授权和资源访问提供了一种安全可靠的机制。它通过授权服务器和访问令牌的机制实现了用户身份验证和资源授权,并提供了安全的访问受限资源的方式。OAuth协议已经成为现代互联网应用程序中最流行和广泛使用的认证和授权协议之一,为用户和开发者带来了极大的便利和安全保障。
相关文章:
OAuth协议详解
一、基本概念 OAuth(Open Authorization)是一种授权协议,用于允许第三方应用程序以受信任的方式访问用户的资源,而无需共享用户的身份验证凭据。OAuth协议的核心目标是在保持用户数据安全的前提下,简化用户在不同应用…...
2024收官之战:车展向下,智驾向上
作者 | 德新 编辑 | 王博 广州车展在上周拉开帷幕,在激烈的车市竞争中,可以说没有一届车展比本届更加「 冰火两重天」。 在本届车展前夕,已经传出不少车企集团面临业务整合的消息,一部分品牌缺席了本届车展,而势头强…...
开源项目-如何更好的参与开源项目开发
开源之谜-提升自我核心竞争力 一、寻找适合自己的开源项目二、像坐牢一样闭关修炼三、最后的实践 开源代码对所有人开放,开发者可以基于现有代码进行扩展和创新,而不是从零开始,参与开源项目可以提升自我的技术能力,丰富个人的经历…...
如何重命名 Conda 环境 - 详细教程
如何重命名 Conda 环境 - 详细教程 前言重命名步骤1. 克隆现有环境2. 验证新环境3. 删除旧环境 实例演示注意事项常见问题解答Q1: 为什么 Conda 没有直接的重命名命令?Q2: 重命名过程会影响环境中的包吗?Q3: 如果克隆过程中断,会怎么样&#…...
自动驾驶之激光雷达
这里写目录标题 1 什么是激光雷达2 激光雷达的关键参数3 激光雷达种类4 自动驾驶感知传感器5 激光雷达感知框架5.1 pointcloud_preprocess5.2 pointcloud_map_based_roi5.3 pointcloud_ground_detection5.4 lidar_detection5.5 lidar_detection_filter5.6 lidar_tracking 1 什么…...
Python毕业设计选题:基于python的豆瓣电影数据分析可视化系统-flask+spider
开发语言:Python框架:flaskPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 系统首页 个人中心 管理员登录界面 管理员功能界面 电影管理 用户管理 系统管理 摘要…...
从 Mac 远程控制 Windows:一站式配置与实践指南20241123
引言:跨平台操作的需求与挑战 随着办公场景的多样化,跨平台操作成为现代开发者和 IT 人员的刚需。从 Mac 系统远程控制 Windows,尤其是在同一局域网下,是一种高效解决方案。不仅能够灵活管理资源,还可以通过命令行简化…...
k8s部署Nginx详细教程
Kubernetes(简称k8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。本文将详细介绍如何使用k8s部署Nginx,包括创建部署配置、创建服务以及如何通过一个命令完成部署和删除。 环境准备 在开始之前&#x…...
PySpark3:pyspark.sql.functions常见的60个函数
目录 一、常见的60个函数 1、col 2、lit 3、sum 4、avg/mean 5、count 6、max 7、min 8、concat 9、substring 10、lower 11、upper 12、trim 13、ltrim 14、rtrim 15、split 16、explode 17、collect_list 18、collect_set 19、asc 20、desc 21、when 2…...
网络爬虫总结与未来方向
通过深入学习和实际操作,网络爬虫技术从基础到进阶得以系统掌握。本节将全面总结关键内容,并结合前沿技术趋势与最新资料,为开发者提供实用性强的深度思考和方案建议。 1. 网络爬虫技术发展趋势 1.1 趋势一:高性能分布式爬虫 随…...
【优先算法】专题——双指针
1.移动零 移动零 题目描述: 思路: 本题我们把数组分块,将非零元素移动到左边,为零元素移动右边。 我们使用双指针算法(利用数组下标来充当指针) 两个指针的作用: cur:从左往右…...
互联网时代的隐私保护
在这个数字化时代,我们的生活与互联网密不可分。打开手机刷刷朋友圈,浏览一下购物网站,约个网约车,点个外卖,这些看似平常的行为都在默默产生着数据足迹。可就在这不经意间,我们的个人信息正在被收集、分析…...
活着就好20241124
今天是周日,一个同样洋溢着休闲与宁静气息的日子。亲爱的朋友们,大家早上好!在经历了一周的忙碌之后,我们终于迎来了这个让人期待已久的休息日。周日,不仅是一个放松身心的绝佳时机,更是我们回归自我、享受…...
镁光MT25QU01GXXX norflash调试笔记
目录 前言一、芯片概述二、数据手册解释1. 数据手册获取2.内容概括 三、几个操作的代码1.复位芯片操作2.读取芯片ID3.擦除芯片扇区4.向芯片存入数据5.读取存储的数据6.其它操作函数 前言 本笔记总结如何使用MCU对nor flash进行数据存储,包括芯片基本介绍࿰…...
并行IO接口8255
文章目录 8255A芯片组成外设接口三个端口两组端口关于C口(★) 内部逻辑CPU接口 8255A的控制字(★)位控字(D70)方式选择控制字(D71) 8255A的工作方式工作方式0(基本输入/输…...
[Unity Demo]从零开始制作空洞骑士Hollow Knight第二十集:制作专门渲染HUD的相机HUD Camera和画布HUD Canvas
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、制作HUD Camera以及让两个相机同时渲染屏幕二、制作HUD Canvas 1.制作法力条Soul Orb引入库2.制作生命条Health读入数据3.制作吉欧统计数Geo Counter4.制作…...
《AI大模型开发笔记》——Prompt提示词最佳实践
为什么需要提示词优化 什么是 Prompt enginnering? 提示词:解释一下什么是大语言模型的Prompt enginnering 图1. 什么是Prompt Enginnering? 通过上面ChatGPT的说明,我们可以看到,prompt工程化就是如何写prompt提示…...
Frontend - 防止多次请求,避免重复请求
目录 一、避免重复执行的多种情况 (一)根据用途 (二)根据用户操作 二、具体实现 (一)“Ajax ”结合disabled (防止多次请求),避免多次点击重复请求 1. 适用场景 2. 解决办法 3. 示例 &…...
MongoDB 简介
MongoDB 简介 MongoDB 是一种流行的 NoSQL 数据库管理系统,以其灵活的数据模型、高性能和易于扩展的特点而闻名。本文将详细介绍 MongoDB 的基本概念、特点、使用场景以及如何在实践中应用。 1. MongoDB 基本概念 1.1 文档数据库 MongoDB 是一个文档数据库,它使用 JSON 风…...
Ngrok实现内网穿透(Windows)
Ngrok实现内网穿透(Windows) 什么是内网穿透,内网穿透有什么用 内网穿透(NAT traversal)是一种技术手段,使得位于内网或防火墙后面的设备能够通过外网访问。例如,如果你的计算机、服务器等设备…...
【Python-办公自动化】实现自动化输出模板表格报告
import pandas as pd import numpy as np# 定义时间范围 date_range = pd.date_range(start=2023-11-01, end=2024-10-31, freq=M...
医学AI公开课·第一期|Machine LearningTransformers in Med AI
小罗碎碎念 从这周开始,我计划每个周末录一个视频,分享一些医学人工智能领域的进展。 作为第一期视频,我打算介绍一下机器学习和Transformer在医学AI领域中的应用。 为了准备这期视频,总共做了24页PPT(三部分内容&…...
ESP8266 STA模式TCP服务器 电脑手机网络调试助手
STA模式TCP服务器和手机电脑网络调试助手多连接...
Transformer架构笔记
Attention is All You Need. 3.Model Architecture 3.1 整体架构如图 3.2 Encoder与Decoder Encoder:由 N 6 N6 N6个相同的Block/Layer堆叠而成。每个Block有两个子层sub-layer:多头注意力和MLP(FFN,前馈神经网络)&…...
初学 flutter 环境变量配置
一、jdk(jdk11) 1)配置环境变量 新增:JAVA_HOMEC:\Program Files\Java\jdk-11 //你的jdk目录 在path新增:%JAVA_HOME%\bin2)验证是否配置成功(cmd运行命令) java java -version …...
【大数据技术基础】 课程 第8章 数据仓库Hive的安装和使用 大数据基础编程、实验和案例教程(第2版)
第8章 数据仓库Hive的安装和使用 8.1 Hive的安装 8.1.1 下载安装文件 访问Hive官网(http://www.apache.org/dyn/closer.cgi/hive/)下载安装文件apache-hive-3.1.2-bin.tar.gz 下载完安装文件以后,需要对文件进行解压。按照Linux系统使用的…...
Postman之newman
系列文章目录 1.Postman之安装及汉化基本使用介绍 2.Postman之变量操作 3.Postman之数据提取 4.Postman之pm.test断言操作 5.Postman之newman Postman之newman 1.基础环境node安装1.1.配置环境变量1.2.安装newman和html报告组件 2.newman运行 newman可以理解为,没有…...
Lua 实现继承的一种方式
以下代码来自Loxodon Framework,截取自其中的一段 function class(classname, super)local cls {}cls.__classname classnamecls.__class clscls.base function (self)return cls.superendcls.__type 0cls.super supercls.__index clsif super thensetmetat…...
相机网卡开启巨型帧和关闭节能模式方法
2022 年 8 月 2 日 Tank 阅读次数(ip/1年): 26,796 win10为例子 首先在开始菜单搜索:网络连接 对想要设置的网络右键:属性 点 配置 高级里面找到这三个选项,参考下图设置,螃蟹网卡建议关掉所有节能有关的…...
如何在 Ubuntu 22.04 上安装带有 Nginx 的 ELK Stack
今天我们来聊聊如何在 Ubuntu 22.04 服务器上安装 ELK Stack,并集成 Nginx 作为 Web 服务器,同时使用 Let’s Encrypt Certbot 进行 SSL 认证。ELK Stack,包括 Elasticsearch、Logstash 和 Kibana,是一套强大的工具,用…...
Android中的依赖注入(DI)框架Hilt
Hilt 是 Android 提供的一种依赖注入(DI)框架,它基于 Dagger,目的是简化依赖注入的使用,提供更易用的接口和与 Android 生命周期组件的紧密集成。下面是 Hilt 的详细介绍。 为什么选择 Hilt? 依赖注入的优势…...
笔记记录 k8s操作
docker下载arm架构的镜像 docker pull centos --platform arm64 其中华为鲲鹏、飞腾CPU采用的是ARM架构,龙芯采用的是MIPS架构,而兆芯、海光CPU采用的是X86架构,申威采用的是Alpha架构 docker查看容器的日志文件目录 docker inspect --format={{.LogPath}} containername…...
掌握Go语言中的异常控制:panic、recover和defer的深度解析
掌握Go语言中的异常控制:panic、recover和defer的深度解析 在Go语言的编程世界中,异常处理是一个不可忽视的话题。Go语言提供了panic、recover和defer三个关键字来处理程序中的异常情况。本文将深入探讨这三个关键字的工作原理、使用场景和最佳实践,帮助读者在实际编程中更…...
SpringBoot项目部署到云服务器全流程
文章目录 一、前期准备(一)云服务器选择(二)本地环境准备(三)数据库准备(若项目需要) 二、服务器配置(一)获取服务器信息(二)重置实例…...
对传统加密算法降维打击?!——量子计算
量子计算 声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无…...
什么是Lodash,有什么特点
什么是 Lodash? Lodash 是一个 JavaScript 工具库,提供了一系列实用的函数来处理常见的编程任务,如数组操作、对象操作、字符串处理等。Lodash 由 John-David Dalton 创建,旨在提供一个更全面、更高效的替代方案,以弥…...
Simulink中Model模块的模型保护功能
在开发工作过程中,用户为想要知道供应商的开发能力,想要供应商的模型进行测试。面对如此要求,为了能够尽快拿到定点项目,供应商会选择一小块算法或是模型以黑盒的形式供客户测试。Simulink的Model模块除了具有模块引用的功能之外&…...
【电子通识】LED的一些基础知识
什么是LED LED是被称为"发光二极管"的半导体,名称取至 "Light Emitting Diode" 的首字母。 从爱迪生1879年发明白炽灯后,白炽灯统治了照明一百多年,为世界带来光明。而在21世纪,白炽灯却早已被取代࿰…...
React Native 基础
React 的核心概念 定义函数式组件 import组件 要定义一个Cat组件,第一步要使用 import 语句来引入React以及React Native的 Text 组件: import React from react; import { Text } from react-native; 定义函数作为组件 const CatApp = () => {}; 渲染Text组件...
C语言 蓝桥杯某例题解决方案(查找完数)
蓝桥杯原题: 一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6 1 2 3.编程找出1000以内的所有完数。 这个题没有很大的难点,与我们上一个解决的问题“质因数分解”不同,它不需要判断因数是否是质数,因此…...
【shodan】(三)vnc漏洞利用
shodan基础(三) 声明:该笔记为up主 泷羽的课程笔记,本节链接指路。 警告:本教程仅作学习用途,若有用于非法行为的,概不负责。 count count命令起到一个统计计数的作用。 用上节的漏洞指纹来试…...
蚁群算法(Ant Colony Optimization, ACO)
简介 蚁群算法(Ant Colony Optimization, ACO)是一种基于自然启发的优化算法,由意大利学者马可多里戈(Marco Dorigo)在1992年首次提出。它受自然界中蚂蚁觅食行为的启发,用于解决离散优化问题。 在自然界…...
python可视化将多张图整合到一起(画布)
这周有点事忙着,没时间重温刚结束的Mathurcup数学建模,这两天也是再看了下,论文还是赶紧挺烂的,但比国赛又有进步(说起国赛又不得不抱怨了,基本其余省份都发了,但江西......哎)。哎&…...
计算机网络socket编程(5)_TCP网络编程实现echo_server
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 计算机网络socket编程(5)_TCP网络编程实现echo_server 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记,欢迎大家在评论区交…...
w055基于web的服装生产管理的设计与实现
🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…...
hadoop集群搭建
一、环境准备⼯作: 确保已经按照以下文档安装完毕:虚拟机和远程工具的安装(hadoop集群安装01)-CSDN博客 Linux设置以及软件的安装(hadoop集群安装02)-CSDN博客 虚拟机的克隆和免密(hadoop集群03)-CSDN博…...
JVM中TLAB(线程本地分配缓存区)是什么
JVM中TLAB(线程本地分配缓存区)是什么 简单来说 TLAB,线程本地分配缓存区,是在 Java 堆内存中的一块线程专属的内存区域,每个线程在创建对象时,首先会尝试在自己的 TLAB 区域内分配内存,这样多…...
如何使用 MMPreTrain 框架
如何使用 MMPreTrain 框架进行预训练模型的微调和推理 MMPreTrain 是一个基于 PyTorch 的开源框架,专注于图像分类和其他视觉任务的预训练模型。它提供了丰富的预训练模型和便捷的接口,使得研究人员和开发者可以轻松地进行模型微调和推理。本文将详细介…...
Python的tkinter如何把日志弄进文本框(Text)
当我们用python的Tkinter包给程序设计界面时,在有些时候,我们是希望程序的日志显示在界面上的,因为用户也需要知道程序目前运行到哪一步了,以及程序当前的运行状态是否良好。python的通过print函数打印出来的日志通常显示在后台&a…...
bash笔记
0 $0 是脚本的名称,$# 是传入的参数数量,$1 是第一个参数,$BOOK_ID 是变量BOOK_ID的内容 1 -echo用于在命令窗口输出信息 -$():是命令替换的语法。$(...) 会执行括号内的命令,并将其输出捕获为一个字符串ÿ…...