Golang的Goroutine(协程)与runtime
目录
Runtime 包概述
Runtime 包常用函数
1. GOMAXPROCS
2. Caller 和 Callers
3. BlockProfile 和 Stack
理解Golang的Goroutine
Goroutine的基本概念
特点:
Goroutine的创建与启动
示例代码
解释
Goroutine的调度
Gosched的作用
示例代码
输出
解释
Goroutine的性能优化
示例代码
解释
实际应用中的使用场景
总结
Runtime与Routine的关系
补充(代码)
Runtime 包概述
runtime 包提供了与 Go 运行时环境交互的功能,包括 goroutine 调度、内存管理、堆栈操作等。通过 runtime 包,我们可以更好地控制程序的运行行为。
Runtime 包常用函数
1. GOMAXPROCS
设置可以并行执行的最大 CPU 数,并返回之前的设置值。
fmt.Println(runtime.GOMAXPROCS(2))
2. Caller 和 Callers
runtime.Caller
和 runtime.Callers
用于获取调用栈信息。
pc, file, line, ok := runtime.Caller(1)
if !ok { fmt.Println("runtime.Caller() failed") return
}
fmt.Printf("PC: %v, File: %s, Line: %d\n", pc, file, line)
3. BlockProfile 和 Stack
runtime.BlockProfile()
用于获取阻塞概述,而 runtime.Stack()
则可以打印当前 goroutine 或所有 goroutine 的堆栈跟踪信息。
理解Golang的Goroutine
Goroutine是Golang语言中的轻量级线程,能够在单一操作系统线程上运行多个Goroutine,从而提高并发编程的效率。本文将通过实际的代码示例,详细讲解Goroutine的创建、调度、性能优化以及在实际应用中的使用场景。
Goroutine的基本概念
Goroutine 是Golang语言中用于并发编程的基本单位。与传统的线程(Thread)相比,Goroutine的调度和切换成本更低,因为它们是基于Golang的协作式调度模型设计的。每个Goroutine的栈大小默认为2KB,但随着其生命周期的变化,栈大小会自动扩大以适应需求。
特点:
- 轻量级:创建和销毁Goroutine的开销非常低。
- 高并发:Golang可以轻松支持数万甚至更多的Goroutine同时运行。
- ** Channels**:Goroutine之间通过Channel进行通信,避免了共享内存带来的竞态条件问题。
Goroutine的创建与启动
Goroutine的创建非常简单,只需要在函数调用前加上go
关键字即可启动一个新的Goroutine。
示例代码
package mainimport ("fmt""runtime"
)func print() {fmt.Println("这是一个新的Goroutine。")
}func main() {go print() // 启动一个新的Goroutinefmt.Println("主Goroutine结束。") // 主Goroutine继续执行
}
解释
go print()
:启动一个新的Goroutine执行print
函数。- 主Goroutine继续执行
fmt.Println("主Goroutine结束。")
。 - 需要注意的是,如果主Goroutine执行完毕,程序可能会直接退出,可能无法看到子Goroutine的输出。为了确保子Goroutine有足够的时间完成,可以通过
time.Sleep()
或者其他同步机制来控制。
Goroutine的调度
Goroutine的调度是由Golang的运行时环境负责的。与线程不同,Goroutine采用的是非抢占式调度,即只有在当前Goroutine主动让出CPU(例如调用runtime.Gosched()
)时,其他Goroutine才能获取执行机会。
Gosched的作用
runtime.Gosched()
用于让出当前Goroutine的执行权限,允许其他Goroutine运行。
示例代码
package mainimport ("fmt""runtime"
)func main() {go func() {for i := 1; i <= 5; i++ {runtime.Gosched()fmt.Println(i)}}()fmt.Println("主Goroutine结束。")
}
输出
主Goroutine结束。
1
2
3
4
5
解释
- 子Goroutine在循环中调用
runtime.Gosched()
,主动让出CPU时间片。 - 主Goroutine在子Goroutine开始后立即执行并输出“主Goroutine结束。”。
Goroutine的性能优化
Goroutine的性能优化主要体现在以下几个方面:
-
设置GOMAXPROCS:通过
runtime.GOMAXPROCS(n)
设置可以并行执行的最大CPU核数。合理设置这个值可以提高程序的并行度。- 示例:
runtime.GOMAXPROCS(2)
,表示最多同时使用2个CPU核心。
- 示例:
-
避免竞态条件:多个Goroutine访问共享变量时,可能会出现竞态条件。可以通过Channel或sync包中的同步原语(如Mutex、RWMutex)来避免。
-
合理分配任务:在高并发场景下,合理分配任务可以提高程序的执行效率。
示例代码
package mainimport ("fmt""math""runtime""sync""time"
)func findPrime(num int, inChan chan int, primeChan chan int, exitChan chan bool) {var flag boolfor {v, ok := <-inChanif !ok {break}flag = truefor i := 2; i < int(math.Sqrt(float64(v))); i++ {if v % i == 0 {flag = falsebreak}}if flag {primeChan <- v}}exitChan <- true
}func main() {num := 10000000 // 查找小于num的所有质数start := time.Now()inChan := make(chan int, num)primeChan := make(chan int, num)exitChan := make(chan bool, 4) // 假设使用4个Goroutinego func() {for i := 2; i < num; i++ {inChan <- i}close(inChan)}()for i := 0; i < 4; i++ {go findPrime(num, inChan, primeChan, exitChan)}go func() {for i := 0; i < 4; i++ {<-exitChan}close(primeChan)}()count := 0for v := range primeChan {count++}fmt.Printf("找到%d个质数,用时:%v\n", count, time.Since(start))
}
解释
- Channel通信:通过Channel传递数据,避免了共享变量带来的竞态条件。
- 并行计算:通过启动多个Goroutine并行计算质数,提高了程序的执行效率。
- 同步机制:通过
exitChan
等待所有Goroutine完成任务。
实际应用中的使用场景
- 并发请求处理:在Web服务器中,通过Goroutine并行处理多个HTTP请求,提高吞吐量。
- 数据处理:在数据处理任务中,通过Goroutine并行处理不同的数据片段,提高处理速度。
- I/O密集型任务:在I/O密集型任务(如文件读写、网络通信)中,Goroutine可以通过非阻塞的方式提高资源利用率。
总结
Goroutine是Golang语言中的并行编程核心,具有轻量级、高效和灵活的特点。通过合理利用Goroutine,可以显著提高程序的性能和响应速度。在实际应用中,需要注意避免竞态条件,合理分配任务,并通过Channel等方式实现Goroutine之间的安全通信。
Runtime与Routine的关系
在Go语言中,runtime
和routine
是两个密切相关但又有明确区别的概念。runtime
主要指的是Go语言的运行时环境,它为Go程序的执行提供了必要的支持,如内存管理、Goroutine调度、错误处理等。而routine
在Go语言中特指Goroutine,即轻量级的线程。
具体来说:
-
Runtime
- 定义:
runtime
是一个Go语言标准库中的包,提供了与程序运行时环境相关的功能。 - 功能:
- Goroutine调度:管理Goroutine的创建、执行和调度。
- 内存管理:负责内存的分配和回收,包括垃圾回收机制。
- 错误处理:提供了一些与错误处理相关的函数,如
runtime.Error
。 - 与操作系统交互:处理程序运行时的环境,如线程数、CPU核数等。
- 性能监控:提供了一些与性能监控相关的函数,如内存使用统计。
- 常用函数:
Gosched()
:让出当前Goroutine的执行权限,允许其他Goroutine运行。GOMAXPROCS()
:设置或获取可以并行执行用户级处理的最大CPU核数。NumCPU()
:返回当前可用的CPU核数。Goexit()
:使当前Goroutine退出,然后调度器会打印当前的栈跟踪信息。
- 定义:
-
Routine(Goroutine)
- 定义:Goroutine是Go语言中的轻量级线性,它由Go的运行时环境管理。
- 特点:
- 轻量级:创建和销毁Goroutine的开销比传统线程低。
- 高并发:可以轻松支持数万甚至更多的Goroutine同时运行。
- 非阻塞式调度:基于协作式调度,主动让出CPU时间片。
- 创建方式:通过
go
关键字启动一个新的Goroutine。 - 常见用途:
- 并发执行任务:将一个函数或方法转换为异步执行,不阻塞主Goroutine。
- 处理I/O密集型任务:在I/O操作中,释放资源让其他Goroutine使用。
- 并行计算:在多核CPU上并行执行任务以提高计算效率。
-
两者的关系
- 调度管理:
runtime
包负责管理Goroutine的调度,包括如何分配时间片、如何在多个CPU核间分配Goroutine等。 - 资源管理:通过
runtime
包,可以控制Goroutine的数量和并行度,优化程序性能。 - 协作式调度:Goroutine通过
runtime.Gosched()
主动让出CPU时间片,协作式调度依赖于Goroutine自身的配合,而不是操作系统强制切换。
- 调度管理:
补充(代码)
package mainimport ("fmt""math""runtime""time"
)func PrintCallerInfo() {//返回调用栈的信息(文件名、行号等)。//参数:skip表示从调用Caller开始往回数多少层的调用栈信息。// skip = 0: 返回调用runtime.Caller的函数(即直接包含runtime.Caller(0)调用的那行代码)的文件名、行号等信息。// skip = 1: 返回调用runtime.Caller所在函数的直接调用者的文件名和行号。换句话说,就是调用了包含runtime.Caller(1)的函数的地方的调用栈信息。// skip = 2: 返回上一步调用者的调用者信息,依此类推。每增加1,就向上追溯一个调用栈帧。// 以此类推,随着skip值的增加,可以逐级向上追溯到更早的调用栈信息。如果指定的层级超出了实际存在的调用栈层数,则ok将为false,其他返回值(pc, file, line)将没有意义或为零值。pc, file, line, ok := runtime.Caller(1)if !ok {fmt.Println("runtime.Caller() failed")return}fmt.Printf("PC: %v, File: %s, Line: %d\n", pc, file, line)
}func main() {// 设置可以并行执行的最大CPU数,并返回之前的设置值;控制了Go程序可以同时使用的操作系统线程数量。fmt.Println(runtime.GOMAXPROCS(2))// 启动一个协程go func(x int) {//time.Sleep(1 * time.Second)fmt.Println("Goroutine", x)}(1)// 终止go func(x int) {defer fmt.Println("Goroutine", x)//time.Sleep(1 * time.Second)runtime.Goexit() // 当前goroutine 退出fmt.Println("This won't print")}(2)// 当前程序中活跃的gotoutines数量fmt.Println("NumGoroutine:", runtime.NumGoroutine())// 让出当前goroutine的处理器,允许其他等待的goroutines运行;// 这是一个提示,而不是强制性的上下文呢切换go func() {for i := 1; i <= 5; i++ {runtime.Gosched()fmt.Println(i)}}()go func(x int) {//time.Sleep(1 * time.Second)fmt.Println("Goroutine", x)}(3)go func(x int) {//time.Sleep(1 * time.Second)fmt.Println("Goroutine", x)}(4)// 其它//runtime.BlockProfile() //获取当前的阻塞概要信息(block profile),它用于分析goroutine之间的同步问题,如锁竞争、通道阻塞等。//runtime.Caller() //返回调用栈的信息(文件名、行号等)。//runtime.Callers() //类似Caller,但返回的是多个调用栈帧的信息。//runtime.GC() //:手动触发垃圾回收。通常不需要手动调用,Go的垃圾收集器会自动管理内存。fmt.Println(runtime.GOROOT()) // 返回Go的安装目录//runtime.KeepAlive(x any) //确保对象在其作用域结束前不会被垃圾回收。//runtime.Stack() //将当前goroutine或所有goroutines的堆栈跟踪写入提供的缓冲区。// runtime.Caller//PrintCallerInfo()//time.Sleep(3 * time.Second) // 确保协程有足够的时间完成//高并发例子FindPrime()//单线程noGoroutine()
}func FindPrime() {var num intvar n intn, _ = fmt.Scanf("%d", &num)fmt.Println(n, num)n = numif num > 32 { // 当num很大时,增大n(即goroutine的数量)却没有带来性能提升甚至导致耗时n = 32}// 对于num=1000000// n = 1, 即noGoroutine(),大约200ms~270ms// n = 2,大约150ms~250ms// n = 4,大约170ms~270ms// n = 8,大约>220ms// 对于num=10000000// n = 1, 即noGoroutine(),大约5s~6s// n = 2,大约2.7s~2.9s// n = 4,大约1.6s~2.0s// n = 8,大约1.8s~2s// n = 16(开始耗时增加), 大约2.1s~2.2s// 对于num=100000000// n = 1, 即noGoroutine(),>100s// n = 4,大约40s~41s// n = 8,大约25s~26s// n = 16, 大约22s~24s// n = 32,大约·32s~33svar primeChan = make(chan int, num)var inChan = make(chan int, num)var exitChan = make(chan bool, n)var start = time.Now()go inPrime(num, inChan)for i := 0; i < n; i++ {go primeJudge(inChan, primeChan, exitChan)}go func() {for i := 0; i < n; i++ {<-exitChan}close(primeChan)}()for {_, ok := <-primeChanif !ok {break}//fmt.Println(res)}close(exitChan)fmt.Println(time.Since(start))
}func inPrime(num int, inChan chan int) {for i := 2; i < num; i++ {inChan <- i}close(inChan)
}func primeJudge(inChan chan int, primeChan chan int, exitChan chan bool) {var flag boolfor {v, ok := <-inChan//fmt.Println("v = ", v, "; ok = ", ok)if !ok {break}flag = truefor i := 2; i < int(math.Sqrt(float64(v))); i++ {if v%i == 0 {flag = falsebreak}}if flag {primeChan <- v}}exitChan <- true
}func noGoroutine() {var num intn, _ := fmt.Scanf("%d", &num)fmt.Println(n, num)var count = 0var start = time.Now()for i := 2; i <= num; i++ {var flag = truefor j := 2; j < (int)(math.Sqrt(float64(i))); j++ {if i%j == 0 {flag = falsebreak}if flag {count++}}}fmt.Println(time.Since(start))
}
相关文章:
Golang的Goroutine(协程)与runtime
目录 Runtime 包概述 Runtime 包常用函数 1. GOMAXPROCS 2. Caller 和 Callers 3. BlockProfile 和 Stack 理解Golang的Goroutine Goroutine的基本概念 特点: Goroutine的创建与启动 示例代码 解释 Goroutine的调度 Gosched的作用 示例代码 输出 解…...
与Linux操作系统相关的引导和服务
目录 一.Linux操作系统引导过程 1.1引导过程总览 1.2系统初始化进程 1.2.1init进程 1.2.2sysmted 1.3systemd单元类型 二.排除启动类故障 2.1MBR扇区故障 2.1.1故障原因 2.1.2故障现象 2.1.3解决办法 2.1.4模拟修复MBR扇区故障 1)添加新的硬盘 2)进行…...
JS API 事件监听
焦点事件案例:搜索框激活下拉菜单 事件对象 事件对象存储事件触发时的相关信息 可以判断用户按键,点击元素等内容 如何获取 事件绑定的回调函数中的第一个形参就是事件对象 一般命名为e,event 事件对象常用属性 type类型 click mouseenter client…...
【8】搭建k8s集群系列(二进制部署)之安装node节点组件(kubelet)
一、下载k8s二进制文件 下载地址: https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG -1.20.md 注:打开链接你会发现里面有很多包,下载一个 server 包就够了,包含了 Master 和 Worker Node 二进制文件。…...
Harmony OS“一多” 详解:基于窗口变化的断点自适应实现
一、一多开发核心概念(18N模式) 目标:一次开发多端部署 解决的问题: 1、界面级一多:适配不同屏幕尺寸 2、功能级一多:设备功能兼容性处理(CanIUser) 3、工…...
Rust切片、结构体、枚举
文章目录 切片类型字符串切片其他结构的切片 结构体结构体实例元组结构体结构体所有权输出结构体结构体的方法结构体关联函数单元结构体 枚举match语法Option枚举类if let 语句 切片类型 切片(Slice)是对数据值的部分“引用” 我们可以从一个数据集合中…...
量子纠错码实战:从Shor码到表面码
引言:量子纠错的必要性 量子比特的脆弱性导致其易受退相干和噪声影响,单量子门错误率通常在10⁻~10⁻量级。量子纠错码(QEC)通过冗余编码测量校正的机制,将逻辑量子比特的错误率降低到可容忍水平。本文从首个量子纠错…...
Pod的生命周期
概念 Pod对象自从其创建开始至其终止退出的时间范围称为其生命周期。在这段时间中,Pod会处于多种不同的状态,并执行一些操作;其中,创建主容器(main container)为必需的操作,其他可选的操作还包…...
使用QAction编辑器添加QAction到ui里
在 Qt Designer 或 Qt Creator 的 UI 设计器 中,可以直接通过 Action Editor 可视化添加和管理 QAction,无需手动编写代码。以下是详细步骤: 步骤 1:打开 Action Editor 在 Qt Creator 中打开 .ui 文件(双击项目中的…...
Unity:标签(tags)
为什么需要Tags? 在游戏开发中,游戏对象(GameObject)数量可能非常多,比如玩家、敌人、子弹等。开发者需要一种简单的方法来区分这些对象,并根据它们的类型执行不同的逻辑。 核心需求: 分类和管…...
深入解析 Python 正则表达式:全面指南与实战示例
深入解析 Python 正则表达式:全面指南与实战示例 📌 引言 正则表达式(Regular Expressions, regex)是用于文本匹配、查找和替换的强大工具。在 Python 中,我们可以使用 re 模块来处理正则表达式。无论是数据清洗、日…...
Nginx介绍及使用
1.Nginx介绍 Nginx是一款开源的、高性能的HTTP和反向代理服务器 1.正向代理和反向代理 正向代理(代理客户端)是一种位于客户端和目标服务器之间的中间服务器。客户端通过正向代理服务器向目标服务器发送请求,代理服务器将请求转发给目标服…...
【Block总结】自适应矩形卷积,即插即用|CVPR2025
论文信息 标题: Adaptive Rectangular Convolution for Remote Sensing Pansharpening年份: 2025年会议: CVPR论文地址: arXiv代码地址: GitHub任务: 遥感图像融合(Pansharpening) 创新点 本论文提出了一种新颖的自适应矩形卷积模块(ARCon…...
第2课:JSX语法与组件基础
第2课:JSX语法与组件基础 学习目标 深入理解JSX语法掌握组件的基本结构和用法学习使用Props传递数据掌握React中的样式添加方法创建任务卡片组件 一、JSX语法深入 1. 什么是JSX? JSX是JavaScript XML的缩写,它允许我们在JavaScript中编写…...
DevOps与Docker的关系
DevOps 与 Docker 是相辅相成的关系。DevOps 是一种强调开发(Development)与运维(Operations)之间协作的文化、实践和工具链,而 Docker 是一种容器化技术,为 DevOps 的实现提供了高效的技术支撑。 Docker …...
嵌入式AI简介
嵌入式AI是一种将人工智能算法部署在终端设备中运行的技术,使智能硬件能够在本地实时完成感知、交互和决策功能,无需依赖云端计算。以下是其核心要点: 一、核心特点 1. 本地化处理:数据在设备端直接处理,无需联网&a…...
多GPU训练
写在前面 限于财力不足,本机上只有一个 GPU 可供使用,因此这部分的代码只能够稍作了解,能够使用的 GPU 也只有一个。 多 GPU 的数据并行:有几张卡,对一个小批量数据,有几张卡就分成几块,每个 …...
JVM虚拟机篇(三):JVM运行时数据区与方法区详解
JVM虚拟机篇(三):JVM运行时数据区与方法区详解 JVM虚拟机篇(三):JVM运行时数据区与方法区详解一、引言二、JVM运行时数据区2.1 概述2.2 各部分的作用与交互2.2.1 堆与其他区域的关系2.2.2 方法区与其他区域…...
Rust学习日记:编写一个Python扩展
参考https://segmentfault.com/a/1190000044555330 命令行创建一个新的Rust项目cargo new --lib rust_python_ext 配置Cargo.toml [package] name "rust_python_ext" version "0.1.0" edition "2024"[lib] name "rust_python_ext"…...
Pod的调度
在默认情况下,一个Pod在哪个Node节点上运行,是由Scheduler组件采用相应的算法计算出来的,这个过程是不受人工控制的。但是在实际使用中,这并不满足的需求,因为很多情况下,我们想控制某些Pod到达某些节点上&…...
系统思考:思考的快与慢
在做重大决策之前,什么原因一定要补充碳水化合物?人类的大脑其实有两套运作模式:系统1:自动驾驶模式,依赖直觉,反应快但易出错;系统2:手动驾驶模式,理性严谨,…...
[ 计算机网络 ] | HTTP协议(一)
目录 前置知识: URL URL的URLENCODE和URLDECODE HTTP协议的宏观格式 如何保证报文是完整的?怎么做序列,反序列化的? 前置知识: URL 我们把数据给别人,别人把数据给我们,不是在做IO嘛~&am…...
大模型快速 ASGI 服务器uvicorn
基础概念类 1. 什么是 Uvicorn,它的作用是什么? 答案:Uvicorn 是一个基于 Python 的快速 ASGI(异步服务器网关接口)服务器。它的主要作用是作为 Web 应用程序的服务器,负责接收客户端的请求,并…...
android studio 基础
1.android Module not specified 今天做一个实验时出现:Android Studio Run/Debug configuration error: Module not specified,要想解决这个问题: 1、打开根目录的 settings.gradle,删除 include :exampleapp 2、在 Android Stu…...
python爬虫爬取淘宝热销(热门)零食商品加数据清洗、销量、店铺及词云数据分析_源码及相关说明文档;售后可私博主
TOC 如有侵权,联系删除 一、环境说明 使用前必须检查以下环境 (1)python编译环境 (2)python脚本执行所需要的库,具体看代码(main.py)import导入的部分库 (3)确保电脑可…...
Android /proc/meminfo解释
高通8295设备 msmnile_gvmq:/proc # cat meminfo MemTotal: 16433968 kB MemFree: 7709832 kB…...
VScode 玩 MCP的server
vscode 1.99版本刚支持MCP server,我就测试了一下 翻到一个gitte的MCP sever 我本身是Mac版本1.99居然没更新agent,所以我就直接用1.100版本的vscode inside了来掩饰一下了 点击setting,然后你要edit一下这个json配置文件 主要修改的其实是…...
详解 MySQL 索引的最左前缀匹配原则
MySQL 的最左前缀匹配原则主要是针对复合索引(也称为联合索引)而言的。其核心思想是:只有查询条件中包含索引最左侧(第一列)开始的连续一段列,才能让 MySQL 有效地利用该索引。 一、 复合索引的结构 复合…...
ROS Master多设备连接
Bash Shell Shell是位于用户与操作系统内核之间的桥梁,当用户在终端敲入命令后,这些输入首先会进入内核中的tty子系统,TTY子系统负责捕获并处理终端的输入输出流,确保数据正确无误的在终端和系统内核之中。Shell在此过程不仅仅是…...
【Mysql】数据库备份与恢复
一、备份类型 物理备份:直接对数据库的数据文件、日志文件、索引文件进行备份 逻辑备份:对数据库对象(库、表)以SQL语句的形式导出进行备份 二、备份工具 1、使用tar、gzip等方式压缩打包数据库文件(完全备份、物理冷…...
Java HttpURLConnection修仙指南:从萌新到HTTP请求大能的渡劫手册
一、筑基篇:初识HttpURLConnection 1.1 基础开光(创建连接) URL url new URL("https://api.example.com/data"); HttpURLConnection conn (HttpURLConnection) url.openConnection(); // 注意!此处可能抛出Malforme…...
python 重要易忘 语言基础
Collections 1、Counter 计数器 counter:计数器 类似字典 统计可迭代对象中元素的出现次数, Counter({b: 3, c: 2, a: 1, d: 1}) 相当于字典{b: 3, c: 2, a: 1, d: 1} a.items() 取键值对 对应为dict_items([(a, 1), (b, 3), (c, 2), (d, 1)]) 也可以是 list(a.items…...
【新能源汽车研发测试数据深度分析:从传感器到智能决策的硬核方法论】
摘要: 本文系统性解构新能源汽车(NEV)研发测试中的数据采集、处理及分析全链条,覆盖传感器融合、大数据清洗、AI算法优化等核心技术,并引入行业顶级案例(如特斯拉Autopilot验证、宁德时代BMS算法迭代&#…...
GD32H759IMT6 Cortex-M7 OpenHarmony轻量系统移植——接管中断修改为不接管
笔者在去年利用国庆时间,将Cortex-M7 的国产厂商兆易创新GD32H459移植OpenHarmony轻量系统,但是适配不太完善——只能选择liteos-m接管中断。这样导致使用中断非常麻烦。于是笔者最近将接管中断模式修改为不接管,这样可以方便的使用gd32提供的…...
MySQL基础学习笔记
学习笔记 1. 基础小知识1.1 数据库分类1.2 下载安装、变量配置过程(略)1.3 连接命令1.4 连接mysql服务端的软件选择1.4.1 要求不高的话,选择有很多1.4.2 适合做企业级管理的工具(适合团队协作)1.4.3 总结 1.5 编程语言…...
[Linux]进程状态、僵尸进程处理回收、进程优先级 + 图例展示
目录 一、进程状态 1.一般操作系统学科的进程状态 二、Linux操作系统的进程状态 运行状态(R) 睡眠状态(S) 深度睡眠状态(D) 暂停状态(T) 追踪暂停状态&#x…...
2022 年 6 月青少年软编等考 C 语言七级真题解析
目录 T1. 有多少种二叉树思路分析T2. 城堡问题T3. 快速堆猪思路分析T4. 重建二叉树思路分析T1. 有多少种二叉树 题目链接:SOJ D1189 输入 n ( 1 < n < 13 ) n\ (1<n<13) n (1<n<13),求 n n n 个结点的二叉树有多少种形态? 思路分析 此题考查 C a…...
flutter修改 Container 中的 Text 和 Image 的样式
在Flutter中,Container 是一个常用的布局组件,它可以包含子组件(如文本、图片等),并允许你通过设置各种属性来自定义样式。如果你需要修改 Container 中的 Text 和 Image 的样式,可以通过以下方式实现。 1.…...
零基础入门unity游戏开发——动画篇】Animation动画窗口,创建编辑动画
考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、…...
【设计模式】命令模式
简介 假设你有一个智能家居遥控器,上面有多个按钮,每个按钮对应不同的设备操作(如开灯、关灯、调空调温度)。 命令模式的解决方案是: 将每个操作(如“开灯”)封装成一个独立的命令对象&#x…...
Python作业3 字符田字格绘制
字符田字格绘制:编写程序,用字符方式打印输出一个简单的田字格,要求采用函数方式,以田字格宽度为参数,能够根据参数绘制任意大小的田字格。 def draw(n):line 3 * n 1for i in range(1, line 1):if i % 3 1:print(n * " —— —— ", end"&quo…...
文章记单词 | 第23篇(六级)
一,单词释义 occupy /ˈɒkjupaɪ/v. 占用,占领,使忙碌thermal /ˈθɜːml/adj. 热的,热量的,保暖的;n. 热气流persistent /pəˈsɪstənt/adj. 执着的,坚持不懈的,持续存在的wee…...
【算法】滑动窗口
什么是滑动窗口算法? 滑动窗口算法本质上就是双指针的一种情况,当两个指针进行移动的方向是同一个方向,并且这两个指针并不会向后回退,一直是往一个方向进行移动的。这也就是滑动窗口的使用场景。 滑动窗口算法的一般步骤 进窗…...
可视化工具
在PyTorch中,可视化工具对于模型调试、性能分析和结果解释至关重要。以下是常用的可视化工具及其应用场景: 1. 训练过程监控 TensorBoard (PyTorch官方集成) 用途:跟踪训练指标(损失、准确率)、可视化模型结构、分析…...
hashtable遍历的方法有哪些
在 Java 中,遍历 Hashtable(或其现代替代品 HashMap)有多种方式,以下是 6 种常用方法的详细说明和代码示例: 1. 使用 keySet() 增强 for 循环 Hashtable<String, Integer> table new Hashtable<>(); // …...
LeetCode --- 443周赛
题目列表 Q1. 到达每个位置的最小费用 Q2. 子字符串连接后的最长回文串 I Q3. 子字符串连接后的最长回文串 II Q4. 使 K 个子数组内元素相等的最少操作数 一、到达每个位置的最小费用 题目要求返回从队尾到达任意位置的最小费用,规则:如果下标 i i i …...
从零构建大语言模型全栈开发指南:附录与资源-3.面试与进阶-200道大模型面试真题与职业发展路线图-基础理论篇50题
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 附录与资源-3. 面试与进阶:200道大模型面试真题与职业发展路线图一、大模型面试真题分类与解析1. 基础理论篇(50+题精选)2. 进阶实战篇(50+题精选)3. 应用场景篇(70题精选)二、职业发展路线图1. …...
使用Android Studio开发基于Java+xml的安卓app之环境搭建
以下是使用Android Studio搭建基于Java和XML的Android应用开发环境的详细步骤: 一、系统要求 操作系统:Windows 7/8/10/11(64位)内存:建议8GB及以上磁盘空间:至少5GB空闲(建议预留10GB以上&…...
GD32H759IMT6 Cortex-M7 OpenHarmony轻量系统移植——4.1版本升级到5.0.3
笔者在去年利用国庆时间,将Cortex-M7 的国产厂商兆易创新GD32H459移植OpenHarmony轻量系统,但是适配不太完善——只能选择liteos-m接管中断。这样导致使用中断非常麻烦。于是笔者最近将接管中断模式修改为不接管,这样可以方便的使用gd32提供的…...
学习汇编随手记
学习汇编随手记 前言 本笔记是关于王爽汇编的笔记,覆盖不全,到了内中断就完结了,听从学长建议,我跑去学xv6了,x86告辞。 1. 寄存器 1.1 寄存器初步 (A,B,C,D)X是通用寄存器,通常存放一般性数据&#x…...