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

go的sync包学习

包含了sync.Mutex,sync.RWMutex,sync.Cond,sync.Map,sync.Once等demo

sync.Mutex


//讲解mutex
import ("fmt""math/rand""sync""time"
)type Toilet struct {m sync.Mutex
}
type Person struct {Name string
}var DateTime = "2006-01-02 15:04:05"var otherThing = []string{"唱歌", "跳舞", "修仙"}func main() {t := &Toilet{}wg := sync.WaitGroup{}wg.Add(5)for i := 0; i < 5; i++ {go func(i int, t *Toilet, wg *sync.WaitGroup) {p := Person{Name: fmt.Sprintf("%d 号", i),}p.InToiletLock(t, wg)}(i, t, &wg)}wg.Wait()}func (p *Person) InToiletLock(t *Toilet, wg *sync.WaitGroup) {defer wg.Done()t.m.Lock()i := rand.Intn(5)fmt.Printf("%s 上厕所时间 %v\n", p.Name, time.Now().Format(DateTime))time.Sleep(time.Duration(i) * time.Second)t.m.Unlock()
}
func (p *Person) InToiletUnLock(wg *sync.WaitGroup) {defer wg.Done()i := rand.Intn(5)fmt.Printf("%s 上厕所时间 %v\n", p.Name, time.Now().Format(DateTime))time.Sleep(time.Duration(i) * time.Second)
}

在这里插入图片描述

sync.RWMutex

package mainimport ("fmt""math/rand""sync""time"
)type Cinema struct {rw *sync.RWMutex
}type Person struct {Name string
}type Admin struct {Name string
}func main() {//example01()exmples2()
}func (p *Person) SitDown(wg *sync.WaitGroup) {defer wg.Done()fmt.Printf("%s 观众坐下!\n", p.Name)
}func (p *Person) StartWatch() {fmt.Printf("%s 开始观看!\n", p.Name)i := time.Duration(rand.Intn(5) + 1)time.Sleep(i * time.Second)fmt.Printf("%s 观看结束!\n", p.Name)
}func (p *Person) WatchMovie(c *Cinema, wg *sync.WaitGroup, b chan int) {c.rw.RLock()//先坐下p.SitDown(wg)<-b//看电影p.StartWatch()c.rw.RUnlock()
}func (a *Admin) ChangeMovie(c *Cinema, wg *sync.WaitGroup) {defer wg.Done()c.rw.Lock()fmt.Printf("所有观众看完电影,%s管理员切换影片\n", a.Name)c.rw.Unlock()
}
func example01() {c := &Cinema{rw: &sync.RWMutex{}}a := &Admin{Name: "超人"}b := make(chan int)wg := sync.WaitGroup{}wg.Add(10)for i := 0; i < 10; i++ {go func(i int, c *Cinema, wg *sync.WaitGroup, b chan int) {p := Person{Name: fmt.Sprintf("%d 号观众", i),}p.WatchMovie(c, wg, b)}(i, c, &wg, b)}wg.Wait()fmt.Printf("所有观众入座,开始播放电影\n")close(b)wg.Add(1)go func(wg *sync.WaitGroup) {a.ChangeMovie(c, wg)}(&wg)wg.Wait()
}type Desk struct {rw     *sync.RWMutexSnacks int
}func (d *Desk) PlaceSnacks(wg *sync.WaitGroup) {defer wg.Done()d.rw.Lock()d.Snacks = 10time.Sleep(3 * time.Second)fmt.Printf("零食准备完毕...\n")d.rw.Unlock()
}
func (p *Person) GetSnacks(d *Desk, wg *sync.WaitGroup) {for !d.rw.TryRLock() {fmt.Printf("桌上没零食,%s 望眼欲穿\n", p.Name)time.Sleep(2 * time.Second)}d.rw.RUnlock()defer wg.Done()defer d.rw.Unlock()d.rw.Lock()if d.Snacks > 0 {fmt.Printf("%s 抢到零食,开心\n", p.Name)d.Snacks--return}fmt.Printf("%s 没抢到零食,难受\n", p.Name)
}
func exmples2() {d := Desk{rw: &sync.RWMutex{},}wg := sync.WaitGroup{}wg.Add(12)go d.PlaceSnacks(&wg)for i := 0; i < 11; i++ {p := Person{Name: fmt.Sprintf("%d 号猿猴", i),}go p.GetSnacks(&d, &wg)}wg.Wait()
}

sync.Cond

package main//sync.Cond进行学习import ("fmt""sync""time"
)var start = false
var done = falsefunc main() {wg := sync.WaitGroup{}wg.Add(10)m := &sync.Mutex{}c := sync.NewCond(m)for i := 0; i < 10; i++ {go Soliders(i, c, &wg)}go Waiter(c)Officer(c)wg.Wait()fmt.Println("所有大兵干完饭")CleanUp(c)time.Sleep(time.Second * 3)fmt.Println("打扫结束")
}func CleanUp(c *sync.Cond) {c.L.Lock()done = truec.L.Unlock()c.Signal()}
func Officer(c *sync.Cond) {fmt.Printf("长官准备中....\n")time.Sleep(time.Second * 5)c.L.Lock()start = truec.L.Unlock()c.Broadcast()
}func Soliders(i int, c *sync.Cond, wg *sync.WaitGroup) {defer wg.Done()c.L.Lock()fmt.Printf("大兵%d号等待干饭...\n", i)for !start {c.Wait()}fmt.Printf("大兵%d号开始干饭...\n", i)c.L.Unlock()
}func Waiter(c *sync.Cond) {c.L.Lock()for !done {c.Wait()}fmt.Println("用餐结束,开始打扫......")c.L.Unlock()return
}

sync.Map


func main() {m := make(map[int]int)for i := 0; i < 1000; i++ {go func(m map[int]int) {m[i] = i}(m)}
}func TestStore(t *testing.T) {var sum sync.Mapsum.Store("a", 1)//sum.Delete("a")val, ok := sum.Load("a")fmt.Println(val, ok)
}func TestLoadAndDelete(t *testing.T) {var smm sync.Mapsmm.Store("a", 1)val, loaded := smm.LoadAndDelete("a")fmt.Printf("value is %v,is exist %v \n", val, loaded)_, ok := smm.LoadAndDelete("a")fmt.Printf("value is ,is exist %v \n", ok)
}func TestLoadAndStore(t *testing.T) {var smm sync.Mapvalue, loaded := smm.LoadOrStore("a", 1)fmt.Printf("value is %v,is exist %v \n", value, loaded)value, loaded = smm.LoadOrStore("a", 2)fmt.Printf("value is %v,is exist %v \n", value, loaded)smm.Store("a", 3)value, loaded = smm.Load("a")fmt.Printf("value is %v,is exist %v \n", value, loaded)
}func TestRange(t *testing.T) {var smm sync.Mapfor i := 0; i < 10; i++ {go func(m *sync.Map, key int, value int) {m.Store(key, value)}(&smm, i, i)}time.Sleep(2 * time.Second)smm.Range(func(key, value interface{}) bool {fmt.Println(key, value)return true})
}

sync.pool

import ("bytes""log""net/http""runtime""sync""time"
)var pool = sync.Pool{New: func() interface{} { return new([]bytes.Buffer) }}func main() {var pool sync.Poolfor i := 0; i < 10; i++ {pool.Put(&http.Client{Timeout: time.Second * time.Duration(10),})}runtime.GC()runtime.GC()p := pool.Get()if p == nil {log.Fatal("p is nil")} else {pool.Put(p)}
}

sync.Once

package mainimport ("fmt""math/rand""sync""sync/atomic""testing""time"
)//主要涉及sync.Oncetype Config struct {Server stringPort   int64
}var (config       *Configonce         OncePowerinitedConfig uint32
)type OncePower struct {sync.Mutexdone uint32
}func init() {rand.Seed(time.Now().UnixNano())
}
func (p *OncePower) Do(fun func() error) error {if atomic.LoadUint32(&p.done) == 0 {return p.doSlow(fun)}return nil
}func (o *OncePower) doSlow(fun func() error) error {o.Lock()defer o.Unlock()if o.done == 0 {err := fun()if err != nil {return err}atomic.StoreUint32(&o.done, 1)}return nil
}
func initConfig() error {//randInt := rand.Intn(6)//if randInt > 2 {//	return errors.New("初始化失败了....")//}config = &Config{Server: "127.0.0.1",Port:   9999,}fmt.Println("init config....")if atomic.LoadUint32(&initedConfig) == 0 {atomic.StoreUint32(&initedConfig, 1)}return nil
}func ReadConfig(i int) *Config {fmt.Println("i >>>", i)err := once.Do(initConfig)fmt.Println("once err >>>", err)return config
}func TestSingleTon(t *testing.T) {wait := sync.WaitGroup{}for i := 0; i < 10; i++ {wait.Add(1)go func(i int) {defer wait.Done()_ = ReadConfig(i)}(i)}wait.Wait()
}func TestOnce(t *testing.T) {var once sync.OnceonceBody := func() {fmt.Println("only once")}done := make(chan bool)for i := 0; i < 10; i++ {go func() {once.Do(onceBody)done <- truefmt.Println("true done", i)}()}for i := 0; i < 10; i++ {<-done}
}

相关文章:

go的sync包学习

包含了sync.Mutex,sync.RWMutex,sync.Cond,sync.Map,sync.Once等demo sync.Mutex //讲解mutex import ("fmt""math/rand""sync""time" )type Toilet struct {m sync.Mutex } type Person struct {Name string }var DateTime "2…...

一文读懂:TCP网络拥塞的应对策略与方案

TCP&#xff08;传输控制协议&#xff09;是互联网中广泛使用的可靠传输协议&#xff0c;它通过序列号、确认应答、重发控制、连接管理以及窗口控制等机制确保数据的可靠传输。然而&#xff0c;在网络环境中&#xff0c;由于多个主机共享网络资源&#xff0c;网络拥塞成为了一个…...

用DeepSeek分析总结一下DeepSeek发表过的8篇论文

1. 《深度求索大语言模型&#xff1a;以长期主义拓展开源语言模型》&#xff08;2024年1月5日&#xff09; 2. 《深度求索代码模型&#xff1a;当大语言模型遇上编程——代码智能的崛起》&#xff08;2024年1月26日&#xff09; 3. 《深度求索视觉语言模型&#xff1a;迈向真…...

node.js使用mysql2对接数据库

一、引言 在现代Web开发中&#xff0c;Node.js作为一种高效、轻量级的JavaScript运行时环境&#xff0c;已经广泛应用于后端服务的开发中。而MySQL&#xff0c;作为一个广泛使用的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;提供了强大的数据存储和查询功能…...

华为支付-免密支付接入免密代扣说明

免密代扣包括支付并签约以及签约代扣场景。 开发者接入免密支付前需先申请开通签约代扣产品&#xff08;即申请配置免密代扣模板及协议模板ID&#xff09;。 华为支付以模板维度管理每一个代扣扣费服务&#xff0c;主要组成要素如下&#xff1a; 接入免密支付需注意&#x…...

Java 面试真题解析与技巧分享

Java 面试对于每一位 Java 开发者来说都是至关重要的&#xff0c;它不仅是对我们技术能力的检验&#xff0c;更是我们迈向理想工作岗位的关键一步。在面试中&#xff0c;掌握常见真题的解题思路和回答技巧&#xff0c;能够让我们更加自信地展示自己的实力。本文将结合具体的面试…...

使用 Python 编程语言来实现机器学习小项目教程案例

以下是一个简单的机器学习小项目教程案例,使用 Python 编程语言和 Scikit-learn 库来实现一个分类任务。我们将使用经典的鸢尾花(Iris)数据集来训练一个分类器,预测鸢尾花的种类。 项目目标 使用机器学习算法对鸢尾花数据集进行分类,预测鸢尾花的类别(Setosa、Versicolor…...

网络安全 | 零信任架构:重构安全防线的未来趋势

网络安全 | 零信任架构&#xff1a;重构安全防线的未来趋势 一、前言二、零信任架构的核心概念与原理2.1 核心概念2.2 原理 三、零信任架构的关键技术组件3.1 身份管理与认证系统3.2 授权与访问控制系统3.3 网络与安全监测系统3.4 加密与数据保护技术 四、零信任架构与传统安全…...

react关于手搓antd pro面包屑的经验(写的不好请见谅)

我们先上代码&#xff0c;代码里面都有注释&#xff0c;我是单独写了一个组件&#xff0c;方便使用&#xff0c;在其他页面引入就行了 还使用了官方的Breadcrumb组件 import React, { useEffect, useState } from react; import { Breadcrumb, Button } from antd; import { …...

PHP-运算符

[题目信息]&#xff1a; 题目名称题目难度PHP-运算符2 [题目考点]&#xff1a; PHP运算符优先级[Flag格式]: SangFor{zEk4r_djfgy0CibPz6LdXpwBrXRckhIT}[环境部署]&#xff1a; docker-compose.yml文件或者docker tar原始文件。 http://分配ip:2067[题目writeup]&#x…...

chrome浏览器chromedriver下载

chromedriver 下载地址 https://googlechromelabs.github.io/chrome-for-testing/ 上面的链接有和当前发布的chrome浏览器版本相近的chromedriver 实际使用感受 chrome浏览器会自动更新&#xff0c;可以去下载最新的chromedriver使用&#xff0c;自动化中使用新的chromedr…...

BurpSuite抓包与HTTP基础

文章目录 前言一、BurpSuite1.BurpSuite简介2.BurpSuite安装教程(1)BurpSuite安装与激活(2)安装 https 证书 3.BurpSuite使用4.BurpSuite资料 二、图解HTTP1.HTTP基础知识2.HTTP客户端请求消息3.HTTP服务端响应消息4.HTTP部分请求方法理解5.HTTPS与HTTP 总结 前言 在网络安全和…...

SQLAlchemy 2.0的简单使用教程

SQLAlchemy 2.0相比1.x进行了很大的更新&#xff0c;目前网上的教程不多&#xff0c;以下以链接mysql为例介绍一下基本的使用方法 环境及依赖 Python:3.8 mysql:8.3 Flask:3.0.3 SQLAlchemy:2.0.37 PyMySQL:1.1.1使用步骤 1、创建引擎&#xff0c;链接到mysql engine crea…...

Android原生开发问题汇总

Fragment顶部出现一个白条怎么办&#xff1f;父类布局搞事情。 layer-list被拉伸问题 Android之 ImageView android:src和tools:src的区别是什么? Android运行时权限的总结&#xff0c;以及EasyPermissions框架的使用 Android Studio添加EasyPemissions Android中module怎…...

springboot中使用注解实现分布式锁

下面将详细介绍如何在 Spring Boot 里借助注解实现分布式锁&#xff0c;以login_lock:作为锁的 key 前缀&#xff0c;使用请求参数里的phone值作为 key&#xff0c;等待时间设为 0 秒&#xff0c;锁的持续时间为 10 秒。我们会使用 Redis 来实现分布式锁&#xff0c;同时借助 S…...

Android TabLayout 使用进阶(含源码)

android:layout_height“match_parent” android:orientation“vertical” tools:context“.mode2.ClassificationActivity”> <com.google.android.material.tabs.TabLayout android:id“id/tab_layout” android:layout_width“match_parent” android:layout_he…...

数据库系统概论的第六版与第五版的区别,附pdf

我用夸克网盘分享了「数据库系统概论第五六版资源」&#xff0c;点击链接即可保存。 链接&#xff1a;https://pan.quark.cn/s/21a278378dee 第6版教材修订的主要内容 为了保持科学性、先进性和实用性&#xff0c;在第5版教材基础上对全书内容进行了修改、更新和充实。 在科…...

管理etcd的存储空间配额

如何管理etcd的存储空间配额 - 防止集群存储耗尽指南 本文基于etcd v3.4官方文档编写 为什么需要空间配额&#xff1f; 在分布式系统中&#xff0c;etcd作为可靠的键值存储&#xff0c;很容易成为系统瓶颈。当遇到以下情况时&#xff1a; 应用程序频繁写入大量数据未及时清理…...

深入浅出 NRM:加速你的 npm 包管理之旅

文章目录 前言一、NRM 是什么&#xff1f;二、为什么需要 NRM&#xff1f;三、NRM 的优势四、NRM 的安装与使用4.1 安装 NRM4.2 查看可用的 npm 源4.3 切换 npm 源4.4 测试 npm 源速度4.5 添加自定义 npm 源4.6 删除 npm 源 五、NRM 的进阶使用六、总结 前言 作为一名 JavaScr…...

ESP32开发学习记录---》GPIO

she 2025年2月5日&#xff0c;新年后决定开始充电提升自己&#xff0c;故作此记,以前没有使用过IDF开发ESP32因此新年学习一下ESP32。 ESPIDF开发环境配置网上已经有很多的资料了&#xff0c;我就不再赘述&#xff0c;我这里只是对我的学习经历的一些记录。 首先学习一个…...

stm32点灯 GPIO的输出模式

目录 1.选择RCC时钟 2.SYS 选择调试模式 SW 3.GPIO 配置 4.时钟树配置&#xff08; 默认不变&#xff09;HSI 高速内部时钟8Mhz 5.项目配置 6.代码 延时1s循环LED亮灭 1.选择RCC时钟 2.SYS 选择调试模式 SW 3.GPIO 配置 4.时钟树配置&#xff08; 默认不变&#xff09…...

[paddle] 矩阵的分解

特征值 设 A A A 是一个 n n n \times n nn 的方阵&#xff0c; λ \lambda λ 是一个标量&#xff0c; v \mathbf{v} v 是一个非零向量。如果满足以下方程&#xff1a; A v λ v A\mathbf{v} \lambda\mathbf{v} Avλv 则称 λ \lambda λ 为矩阵 A A A 的一个 特征值…...

【基于SprintBoot+Mybatis+Mysql】电脑商城项目之修改密码和个人资料

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【Spring篇】【计算机网络】【Mybatis篇】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 目录 &#x1f383;1.修改密码 -持久…...

【深度学习】DataLoader自定义数据集制作

第一步 导包 import os import matplotlib.pyplot as plt %matplotlib inline import numpy as np import torch from torch import nn import torch.optim as optim import torchvision from torchvision import transforms,models,datasets import imageio import time impo…...

【Elasticsearch】Geo-distance聚合

geo_distance聚合的形状是圆形。它基于一个中心点&#xff08;origin&#xff09;和一系列距离范围来计算每个文档与中心点的距离&#xff0c;并将文档分配到相应的距离范围内。这种聚合方式本质上是以中心点为圆心&#xff0c;以指定的距离范围为半径的圆形区域来划分数据。 为…...

【R语言】apply函数族

在R语言中使用循环操作时是使用自身来实现的&#xff0c;效率较低。所以R语言有一个符合其统计语言出身的特点&#xff1a;向量化。R语言中的向量化运用了底层的C语言&#xff0c;而C语言的效率比高层的R语言的效率高。 apply函数族主要是为了解决数据向量化运算的问题&#x…...

Vue - shallowRef 和 shallowReactive

一、shallowRef 和 shallowReactive &#xff08;一&#xff09;shallowRef 在 Vue 3 中&#xff0c;shallowRef 是一个用于创建响应式引用的 API&#xff0c;它与 ref 相似&#xff0c;但它只会使引用的基本类型&#xff08;如对象、数组等&#xff09;表现为响应式&#xf…...

双目标定与生成深度图

基于C#联合Halcon实现双目标定整体效果 一&#xff0c;标定 1&#xff0c;标定前准备工作 &#xff08;获取描述文件与获取相机参数&#xff09; 针对标准标定板可以直接调用官方提供描述文件&#xff0c;也可以自己生成描述文件后用PS文件打印 2&#xff0c;相机标定 &…...

实名制-网络平台集成身份证实名认证接口/身份证查询-PHP

在当今数字化快速发展的时代&#xff0c;线上平台的安全性和用户体验成为了衡量其成功与否的关键因素。其中&#xff0c;身份证实名认证接口的集成显得尤为重要&#xff0c;它不仅为用户提供了更加安全、可靠的网络环境&#xff0c;同时也增强了平台的信任度和合规性。 对于任…...

全面解析机器学习优化算法中的进化策略

全面解析机器学习优化算法中的进化策略 全面解析机器学习优化算法中的进化策略引言什么是进化策略?基本概念核心组件算法流程数学基础高斯扰动期望值更新与其他优化方法的比较梯度下降法(Gradient Descent, GD)遗传算法(Genetic Algorithm, GA)Python案例基本实现改进版:…...

go数据结构学习笔记

本博文较为完整的实现了go的链表、栈&#xff0c;队列&#xff0c;树&#xff0c;排序&#xff0c;链表包括顺序链表&#xff0c;双向链表&#xff0c;循环链表&#xff0c;队列是循环队列&#xff0c;排序包含冒牌、选择 1.链表 1.1 顺序链表 type LNode struct {data intn…...

【深度学习】DeepSeek模型介绍与部署

原文链接&#xff1a;DeepSeek-V3 1. 介绍 DeepSeek-V3&#xff0c;一个强大的混合专家 (MoE) 语言模型&#xff0c;拥有 671B 总参数&#xff0c;其中每个 token 激活 37B 参数。 为了实现高效推理和成本效益的训练&#xff0c;DeepSeek-V3 采用了多头潜在注意力 (MLA) 和 De…...

使用SpringBoot发送邮件|解决了部署时连接超时的bug|网易163|2025

使用SpringBoot发送邮件 文章目录 使用SpringBoot发送邮件1. 获取网易邮箱服务的授权码2. 初始化项目maven部分web部分 3. 发送邮件填写配置EmailSendService [已解决]部署时连接超时附&#xff1a;Docker脚本Dockerfile创建镜像启动容器 1. 获取网易邮箱服务的授权码 温馨提示…...

【工具篇】深度揭秘 Midjourney:开启 AI 图像创作新时代

家人们,今天咱必须好好唠唠 Midjourney 这个在 AI 图像生成领域超火的工具!现在 AI 技术发展得那叫一个快,各种工具层出不穷,Midjourney 绝对是其中的明星产品。不管你是专业的设计师、插画师,还是像咱这种对艺术创作有点小兴趣的小白,Midjourney 都能给你带来超多惊喜,…...

构成正方形的数量:算法深度剖析与实践

目录 引言算法核心概念 定义正方形的构成条件数据结构与输入形式算法数学原理 几何关系的数学表达坐标运算与判定逻辑Python 实现 代码展示代码解析Python 实现的优势与局限C 语言实现 代码展示代码解析C 语言实现的性能特点性能分析与优化 性能分析 时间复杂度空间复杂度优化思…...

Spring设计模式(9种)(详细篇)

总体分为三大类&#xff1a; 创建型模式&#xff1a;工厂方法模式、单例模式。 结构型模式&#xff1a;适配器模式、代理模式、装饰器模式。 行为型模式&#xff1a;观察者模式、策略模式、模板方法模式。 一、简单工厂模式&#xff08;Simple Factory&#xff09; 概述&…...

使用Express.js和SQLite3构建简单TODO应用的后端API

使用Express.js和SQLite3构建简单TODO应用的后端API 引言环境准备代码解析1. 导入必要的模块2. 创建Express应用实例3. 设置数据库连接4. 初始化数据库表5. 配置中间件6. 定义数据接口7. 定义路由7.1 获取所有TODO项7.2 创建TODO项7.3 更新TODO项7.4 删除TODO项 8. 启动服务器 …...

2025年2月6日(anaconda cuda 学习 基本命令)

查看电脑的显卡型号是否支持CUDA的安装 https://developer.nvidia.com/zh-cn/cuda-gpus 查看可以安装的CUDA版本 https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html CUDA安装地址 https://developer.nvidia.com/cuda-toolkit-archive Anaconda下载地址 htt…...

大数据方向知识图谱及发展前景分析

目录 一、知识体系 二、大数据领域前景分析&#xff1a; 1. 市场需求 2. 技术趋势 3. 职业发展路径 4. 学习路线建议 5. 推荐认证体系 一、知识体系 大数据知识体系 ├── 基础理论 │ ├── 数学基础&#xff1a;概率统计、线性代数、离散数学 │ ├── 计算机基…...

Docker深度解析:安装各大环境

安装 Nginx 实现负载均衡&#xff1a; 挂载 nginx html 文件&#xff1a; 创建过载目录&#xff1a; mkdir -p /data/nginx/{conf,conf.d,html,logs} 注意&#xff1a;在挂载前需要对 conf/nginx.conf 文件进行编写 worker_processes 1;events {worker_connections 1024; …...

Verilog语言学习总结

Verilog语言学习&#xff01; 目录 文章目录 前言 一、Verilog语言是什么&#xff1f; 1.1 Verilog简介 1.2 Verilog 和 C 的区别 1.3 Verilog 学习 二、Verilog基础知识 2.1 Verilog 的逻辑值 2.2 数字进制 2.3 Verilog标识符 2.4 Verilog 的数据类型 2.4.1 寄存器类型 2.4.2 …...

K8S Deployment 实现 蓝绿 发布

一、何为蓝绿发布 蓝绿发布&#xff08;Blue - Green Deployment&#xff09;是一种软件部署策略&#xff0c;旨在最大程度减少应用程序停机时间&#xff0c;确保新老版本系统平稳过渡。以下为详细介绍&#xff1a; 1.1、基本概念 存在两个完全相同的生产环境&#xff0c;通…...

2025新鲜出炉--前端面试题(一)

文章目录 1. vue3有用过吗, 和vue2之间有哪些区别2. vue-router有几种路由, 分别怎么实现3. webpack和rollup这两个什么区别, 你会怎么选择4. 你能简单介绍一下webpack项目的构建流程吗5. webpack平时有手写过loader和plugin吗6. webpack这块你平时做过哪些优化吗&#xff1f;7…...

【ArcGIS Pro 简介1】

ArcGIS Pro 是由 Esri &#xff08;Environmental Systems Research Institute&#xff09;公司开发的下一代桌面地理信息系统&#xff08;GIS&#xff09;软件&#xff0c;是传统 ArcMap 的现代化替代产品。它结合了强大的空间分析能力、直观的用户界面和先进的三维可视化技术…...

CentOS 6.5编译Rsyslog 8.1903.0

个人博客地址&#xff1a;CentOS 6.5编译Rsyslog 8.1903.0 | 一张假钞的真实世界 个人很早之前的博文&#xff0c;迁移至此作为历史记录。 源码下载参考我的另外一片博文&#xff1a;CentOS 7.3 编译 Rsyslog 8.1903.0。 本篇博文从创建构建环境开始填坑/(ㄒoㄒ)/~~。通过上…...

SQLAlchemy-2.0中模型定义和alembic的数据库迁移工具

SQLAlchemy-2.0中模型定义和alembic的数据库迁移工具 一、SQLAIchemy的介绍二、数据库引擎1、支持的数据库1.1、sqlite数据库1.2、MySQL数据库1.3、数据库引擎的参数 三、定义模型类1、定义模型2、engine负责数据库迁移 四、alembic数据库迁移⼯具1、安装alembic2、初始化alemb…...

两种文件类型(pdf/图片)打印A4半张纸方法

环境:windows10、Adobe Reader XI v11.0.23 Pdf: 1.把内容由横排变为纵排&#xff1a; 2.点击打印按钮&#xff1a; 3.选择打印页范围和多页&#xff1a; 4.内容打印在纸张上部 图片&#xff1a; 1.右键图片点击打印&#xff1a; 2.选择打印类型&#xff1a; 3.打印配置&am…...

【React】合成事件语法

React 合成事件是 React 为了处理浏览器之间的事件差异而提供的一种跨浏览器的事件系统。它封装了原生的 DOM 事件&#xff0c;提供了一致的事件处理机制。 合成事件与原生事件的区别&#xff1a; 合成事件是 React 自己实现的&#xff0c;封装了原生事件。合成事件依然可以通…...

深入解析:如何利用 Python 爬虫获取商品 SKU 详细信息

在电商领域&#xff0c;SKU&#xff08;Stock Keeping Unit&#xff0c;库存单位&#xff09;详细信息是电商运营的核心数据之一。它不仅包含了商品的规格、价格、库存等关键信息&#xff0c;还直接影响到库存管理、价格策略和市场分析等多个方面。本文将详细介绍如何利用 Pyth…...

Unity 加载OSGB(webgl直接加载,无需转换格式!)

Unity webgl加载倾斜摄影数据 前言效果图后续不足 前言 Unity加载倾斜摄影数据&#xff0c;有很多的插件方便好用&#xff0c;但是发布到网页端均失败&#xff0c;因为webgl 的限制&#xff0c;IO读取失效。 前不久发现一个开源项目: UnityOSGB-main 通过两种方式在 Unity 中…...