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

【在Linux世界中追寻伟大的One Piece】自旋锁

目录

1 -> 概述

2 -> 原理

3 -> 优缺点及使用场景

3.1 -> 优点

3.2 -> 缺点

3.3 -> 使用场景

4 -> 纯软件自旋锁类似的原理实现

4.1 -> 结论

5 -> 样例代码


1 -> 概述

自旋锁是一种多线程同步机制,用于保护共享资源避免受并发访问的影响。

在多个线程尝试获取锁时,它们会持续自选(即在一个循环中不断检查锁是否可用)而不是立即进入休眠状态等待锁的释放。

这种机制减少了线程切换的开销,适用于短时间内锁的竞争情况。但是不合理的使用,可能会造成CPU的浪费。

2 -> 原理

自旋锁通常使用一个共享的标志位(如一个布尔值)来表示锁的状态。当标志位为true时,表示锁已经被某个线程占用;当标志位为false时,表示锁可用。当一个线程尝试获取自旋锁时,它会不断检查标志位:

  • 如果标志位为true(即锁已经被其他线程占用),线程会在一个循环中不断自旋等待,直到锁被释放。
  • 如果标志位为false,表示锁可用,线程将标志位设置为true,表示自己占用了锁,并进入临界区。

大致流程:

  1. 尝试获取锁:当一个线程需要访问共享资源时,它会尝试获取自旋锁。如果锁已经被其他线程持有,则当前线程不会立即进入阻塞状态。
  2. 自旋等待:当前线程会进入一个循环(通常称为“自旋”),在这个循环中它会不断检查锁是否已经被释放。这通常是通过一个原子操作(如CAS,Compare-And-Swap)来实现的,该操作会检查锁的状态并尝试将其设置为已锁定。
  3. 获取锁成功:如果锁已经被释放(即其他线程已经完成了对共享资源的访问并释放了锁),则当前线程会成功获取锁,并退出自旋循环。
  4. 执行临界区代码:一旦获取了锁,当前线程就可以安全地访问共享资源,并执行临界区代码。
  5. 释放锁:完成临界区代码的执行后,当前线程会释放锁,以便其他线程可以获取锁并访问共享资源。 

3 -> 优缺点及使用场景

3.1 -> 优点

  • 低延迟:自旋锁适用于短时间内的锁竞争情况。因为它不会让线程进入休眠状态,从而避免了线程切换的开销,提高了锁的操作效率。
  • 减少系统调度开销:等待锁的线程不会被阻塞,不需要上下文切换,从而减少了系统调度开销。

3.2 -> 缺点

  • CPU资源浪费:如果锁的持有时间较长,等待获取锁的线程就会一直循环等待,导致CPU资源的浪费。
  • 可能引起活锁:当多个线程同时自旋等待同一个锁时,如果没有适当的退避策略,可能会导致所有线程都在不断检查锁状态而无法进入临界区,形成活锁。

3.3 -> 使用场景

  1. 短暂等待的情况:适用于锁被占用时间很短的场景,如多线程对共享数据进行简单的读写操作。
  2. 多线程锁使用:通常用于系统底层,同步多个CPU对共享资源的访问。

4 -> 纯软件自旋锁类似的原理实现

自旋锁的实现通常使用原子操作来保证操作的原子性,常用的软件实现方式是通过CAS(Compare-And-Swap)指令实现。以下是一个简单的自旋锁实现示例(伪代码):

#include <stdio.h>
#include <stdatomic.h>
#include <pthread.h>
#include <unistd.h>// 使用原子标志来模拟自旋锁
atomic_flag spinlock = ATOMIC_FLAG_INIT; // ATOMIC_FLAG_INIT 是 0// 尝试获取锁
void spinlock_lock() 
{while (atomic_flag_test_and_set(&spinlock)) {// 如果锁被占用,则忙等待}
}// 释放锁
void spinlock_unlock() 
{atomic_flag_clear(&spinlock);
}
typedef _Atomic struct
{
#if __GCC_ATOMIC_TEST_AND_SET_TRUEVAL == 1_Bool __val;
#elseunsigned char __val;
#endif
} atomic_flag;
  • 功能描述:atomic_flag_test_and_set函数检查atomic_flag的当前状态。如果atomic_flag之前没有被设置过(即其值为false或"未设置"状态),则函数会将其设置为true(或"设置"状态),并返回先前的值(在这种情况下为false)。如果atomic_flag之前已经被设置过(即其值为true),则函数不会改变其状态,但会返回true。
  • 原子性:这个操作是原子的,意味着在多线程环境中,它保证了对atomic_flag的读取和修改是不可分割的。当一个线程调用此函数时,其他线程无法看到这个操作的任何中间状态,这确保了操作的线程安全性。

Linux提供的自旋锁系统调用

#include <pthread.h>int pthread_spin_lock(pthread_spinlock_t* lock);
int pthread_spin_trylock(pthread_spinlock_t* lock);
int pthread_spin_unlock(pthread_spinlock_t* lock);
int pthread_spin_init(pthread_spinlock_t* lock, int pshared);
int pthread_spin_destroy(pthread_spinlock_t* lock);

注意:

  • 在使用自旋锁时,需要确保锁被释放的时间尽可能短,以避免CPU资源的浪费。
  • 在多CPU环境下,自旋锁可能不如其他锁机制高效,因为它可能导致线程在不同的CPU上自旋等待。

4.1 -> 结论

自旋锁是一种适用于短时间内锁竞争情况的同步机制,它通过减少线程切换的开销来提高锁操作的效率。然而,它也存在CPU资源浪费和可能引起活锁等缺点。在使用自旋锁时,需要根据具体的应用场景进行选择,并确保锁被释放的时间尽可能短。

5 -> 样例代码

// 操作共享变量会有问题的售票系统代码#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>int ticket = 1000;//pthread_spinlock_t lock;
void* route(void* arg)
{char* id = (char*)arg;while (1){//pthread_spin_lock(&lock);if (ticket > 0){usleep(1000);printf("%s sells ticket:%d\n", id, ticket);ticket--;//pthread_spin_unlock(&lock);}else{//pthread_spin_unlock(&lock);break;}}return nullptr;
}int main(void)
{//pthread_spin_init(&lock, PTHREAD_PROCESS_PRIVATE);pthread_t t1, t2, t3, t4;pthread_create(&t1, NULL, route, (void*)"thread 1");pthread_create(&t2, NULL, route, (void*)"thread 2");pthread_create(&t3, NULL, route, (void*)"thread 3");pthread_create(&t4, NULL, route, (void*)"thread 4");pthread_join(t1, NULL);pthread_join(t2, NULL);pthread_join(t3, NULL);pthread_join(t4, NULL);//pthread_spin_destroy(&lock);
}

感谢各位大佬支持!!!

互三啦!!!

相关文章:

【在Linux世界中追寻伟大的One Piece】自旋锁

目录 1 -> 概述 2 -> 原理 3 -> 优缺点及使用场景 3.1 -> 优点 3.2 -> 缺点 3.3 -> 使用场景 4 -> 纯软件自旋锁类似的原理实现 4.1 -> 结论 5 -> 样例代码 1 -> 概述 自旋锁是一种多线程同步机制&#xff0c;用于保护共享资源避免受并…...

信创改造-Spring Boot 项目部署至 TongWeb

打 war 包参考&#xff1a;https://blog.csdn.net/z1353095373/article/details/144330999...

选择WordPress和Shopify:搭建对谷歌SEO友好的网站

在建设网站时&#xff0c;不仅要考虑它的美观和功能性&#xff0c;还要关注它是否对谷歌SEO友好。如果你希望网站能够获得更好的搜索排名&#xff0c;WordPress和Shopify是两个值得推荐的建站平台。 WordPress作为最流行的内容管理系统&#xff0c;其强大的灵活性和丰富的插件…...

Rust之抽空学习系列(二)—— 编程通用概念(上)

Rust之抽空学习系列&#xff08;二&#xff09;—— 编程通用概念&#xff08;上&#xff09; Rust 作为一门强类型的静态类型语言&#xff0c;会有哪些与生俱来的天赋呢&#xff1f; 1、静态类型语言 vs 动态类型语言 特性静态动态类型检查编译时运行时错误检测执行前执行期…...

《神经网络与深度学习》(邱锡鹏) 内容概要【不含数学推导】

第1章 绪论 基本概念&#xff1a;介绍了人工智能的发展历程及不同阶段的特点&#xff0c;如符号主义、连接主义、行为主义等。还阐述了深度学习在人工智能领域的重要地位和发展现状&#xff0c;以及其在图像、语音、自然语言处理等多个领域的成功应用。术语解释 人工智能&…...

Wireshark如何查看数据包时间间隔

1.如果数据包量不大&#xff0c;抓包本身也不大&#xff0c;建议从绝对时间判断&#xff0c;打开wireshark软件&#xff0c;并点开相应要分析的抓包文件。 进入到最上方菜单<视图>,在弹出菜单选择时间显示格式&#xff0c;再在右侧菜单中选择自捕获经过的秒数。 这样就可…...

ISP和IQ调试(一)

系列文章目录 文章目录 系列文章目录前言一、ISP&#xff08;image signal process)二、ISP位置三、IQ总结 前言 一、ISP&#xff08;image signal process) image signal process 图像处理技术 image signal processor 图像信号处理器 设备 什么是图像信号&#xff1f; 代表…...

uniapp改成用vue起项目

目的&#xff1a;让项目按照vue的打包流程跑流水线 1.按照uniapp官网教程执行 2.执行第二条命令时报错 ERROR Failed to get response from true/vue-cli-version-marker 3.解决方式 报错可能跟yarn有关&#xff0c;然后切换成npm 找到自己本地电脑的这个文件 按照截图修…...

java之集合(详细-Map,Set,List)

1集合体系概述 1.1集合的概念 集合是一种容器&#xff0c;用来装数据的&#xff0c;类似于数组&#xff0c;但集合的大小可变&#xff0c;开发中也非常常用。 1.2集合分类 集合分为单列集合和多列集合 Collection代表单列集合&#xff0c;每个元素&#xff08;数据&#xff…...

利用卷积神经网络进行手写数字的识别

数据集介绍 MNIST&#xff08;Modified National Institute of Standards and Technology&#xff09;数据集是一个广泛使用的手写数字识别数据集&#xff0c;常用于机器学习和计算机视觉领域中的分类任务。它包含了从0到9的手写数字样本&#xff0c;常用于训练和测试各种图像…...

Flutter 桌面端串口配置

前言 我使用flutter_libserialport包在macOS中实现串口通信的功能&#xff0c;可以实现数据收发&#xff0c;但是收到的内容是乱码。这种情况一般都是由于波特率和硬件设备不一致导致的。 配置串口配置 1.打开串口读写 import package:flutter_libserialport/flutter_libser…...

Java 的常量池与 String 优化

Java 中的常量池&#xff08;Constant Pool&#xff09;是一种内存优化机制&#xff0c;比如字符串常量池&#xff1a; String s1 "Hello"; String s2 "Hello"; System.out.println(s1 s2); // 输出 true&#xff0c;因为指向同一池中的对象但对于使用…...

防范TCP攻击:策略与实践

TCP&#xff08;传输控制协议&#xff09;是互联网通信的核心协议之一&#xff0c;它确保了数据在网络上的可靠传输。然而&#xff0c;TCP也容易成为各种网络攻击的目标&#xff0c;如SYN洪水攻击、TCP连接耗尽攻击等。本文将探讨如何通过配置防火墙规则、优化服务器设置以及采…...

单片机:实现呼吸灯(附带源码)

单片机实现呼吸灯详细解读 呼吸灯是一种常见的灯光效果&#xff0c;广泛应用于电子产品、汽车、家居照明等领域。其基本特性是通过逐渐增亮和减弱的方式&#xff0c;使得灯光呈现出“呼吸”的效果&#xff0c;给人一种平缓、舒适的视觉感受。在嵌入式系统中&#xff0c;呼吸灯…...

Android 第三方框架:RxJava:源码分析:责任链模式

文章目录 责任链模式RxJava中的责任链总结 责任链模式 RxJava中的责任链 链式调用的使用过程中形成了两个单向链表 第一个单向链表是Observable链表 它的形成过程&#xff1a; 1.首先调用Observable的静态方法创建第一个Observable对象&#xff0c;作为Observable链表的表…...

基于HTML的个人博客系统的设计与实现

一、前言 随着互联网的飞速发展&#xff0c;人们分享生活、表达观点和展示自我的需求日益增长。个人博客作为一种重要的网络交流平台&#xff0c;为用户提供了便捷的信息发布和分享渠道。它不仅可以记录个人的成长经历、专业知识、兴趣爱好等&#xff0c;还能促进用户之间的互动…...

DMA(Direct Memory Access):直接内存访问

DMA&#xff08;Direct Memory Access&#xff09;&#xff1a;直接内存访问 一、传统CPU存取数据 CPU不直接存取外设的原因主要有两点&#xff1a; 速度差异&#xff1a;CPU的处理速度远高于外设&#xff0c;无法直接同步。格式多样性&#xff1a;外设数据格式种类繁多&…...

数据分析python小工具录入产品信息到Excel

在没有后台管理系统的时候&#xff0c;有时候为了方便起见&#xff0c;想提供一个输入框让运营人员直接输入&#xff0c;然后数据就会以数据库的形式存进数据库 效果图&#xff1a; 输入用户名 输入数据 输入信息后点击添加到表格&#xff0c;检查后方便批量保存到excel …...

Mac安装brew的终极方法

/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"按回车后&#xff0c;根据提示操作&#xff1a; 输入镜像序号&#xff08;1-5都可以&#xff09;输入Y&#xff0c;回车等待brew安装完成即可。 M系列芯片亲测有效&#x…...

卷积神经网络比于全连接神经网络强在哪?

卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称CNN&#xff09;与全连接神经网络&#xff08;Fully Connected Neural Networks&#xff0c;简称FFNN&#xff09;是深度学习和神经网络领域中两种最为常见的网络结构。两者在结构、工作原理及应用场景上…...

Stable Diffusion Controlnet常用控制类型解析与实战课程 4

本节内容&#xff0c;是stable diffusion Controlnet常用控制类型解析与实战的第四节课程。上节课程&#xff0c;我们陆续讲解了几个与图像风格约束相关的控制类型&#xff0c;本节课程我们再学习一些实用价值较高的控制类型&#xff0c;看一看他们提供了哪些控制思路。 一&…...

[ShaderLab] 【Unity】【图像编程】理解 Unity Shader 的结构

在计算机图形学领域,开发者经常面临着管理着色器复杂性的挑战。正如大卫惠勒(David Wheeler)所说:“计算机科学中的任何问题都可以通过增加一层抽象来解决。” Unity 提供了这样一层抽象,即 ShaderLab,它通过组织和定义渲染过程的各个步骤,简化了编写着色器的过程。 什…...

Source Insight的使用经验汇总

01-Add All"和“Add Tree”有何区别&#xff1f; 在 Source Insight 中&#xff0c;“Add All”和“Add Tree”是两种向项目&#xff08;Project&#xff09;中添加文件的操作选项&#xff0c;它们的区别在于处理文件和目录的方式不同&#xff1a; 1. Add All 范围&am…...

CentOS 7.9 更换 YUM:解决宝塔安装困境的探索之旅

在进行网站搭建工作时&#xff0c;我满怀期待地准备安装宝塔面板&#xff0c;然而却遭遇了安装失败的挫折。经过一番排查与思考&#xff0c;我将目光聚焦到了系统的 YUM 上&#xff0c;怀疑它可能是导致问题的“罪魁祸首”。于是&#xff0c;我毅然决定对 CentOS 7.9 的 YUM 进…...

28. Three.js案例-创建圆角矩形并进行拉伸

28. Three.js案例-创建圆角矩形并进行拉伸 实现效果 知识点 WebGLRenderer (WebGL渲染器) WebGLRenderer 是 Three.js 中用于渲染 3D 场景的主要渲染器。 构造器 WebGLRenderer( parameters : Object ) 参数类型描述parametersObject渲染器的配置参数&#xff0c;可选。 …...

最佳实践:编写和配置 Stylelint 自定义插件,Stylelint 自定义规则

前言 在前端开发中&#xff0c;代码质量和一致性是至关重要的。Stylelint 作为一个强大的 CSS 代码检查工具&#xff0c;能够帮助开发者发现代码中的问题&#xff0c;并保持代码风格的一致性。然而&#xff0c;内置的规则和插件有时无法完全满足特定项目的需求。在这种情况下&…...

vscode借助插件调试OpenFoam的正确的.vscode配置文件

正确的备份文件位置&#xff1a; /home/jie/桌面/理解openfoam/正确的调试爆轰单进程案例/mydebugblastFoam 调试爆轰案例流体 并且工作区和用户区都是openfoam-7版本 问题&#xff1a;F5以debug模式启动后不停在断点 解决方法&#xff1a; 这里备份一下.vsode正确的配置&…...

Towards Frame Rate Agnostic Multi-object Tracking—迈向帧率无关的多目标跟踪

Towards Frame Rate Agnostic Multi-object Tracking—迈向帧率无关的多目标跟踪 发表在IJCV 2023年 作者&#xff1a;Weitao Feng, Lei Bai, Yongqiang Yao, Fengwei Yu & Wanli Ouyang 研究目标&#xff1a;多目标跟踪的帧率无关性研究 IJCV 在计算机视觉领域的影响力非常…...

视频网站中重磅推荐模块(附加源码)

写在开头 上期代码主要实现省市区三级联动效果&#xff0c;开发久了很多功能都是通过框架组件库来完成&#xff0c;但是如果组件满足不了开发需求&#xff0c;还需要开发人员手动封装组件&#xff0c;专门出这样一期文章&#xff0c;通过原生js实现一些特定功能&#xff0c;功能…...

Flink keyBy算子的分区规则

demo代码 String worlds "flink,spark,hadoop,zk,kafka";streamSource.flatMap(new RichFlatMapFunction<String, String>() {Overridepublic void flatMap(String value, Collector<String> collector) throws Exception {String[] worlds value.spl…...

jvm内存优化方式

1. JVM&#xff08;Java Virtual Machine&#xff09;&#xff1a; • 定义&#xff1a;Java虚拟机&#xff0c;是运行Java字节码的抽象计算机。 • 内存管理&#xff1a;负责内存的分配和回收&#xff0c;是JVM内存优化的核心。 2. 堆&#xff08;Heap&#xff09;&#xff1a…...

顺序表的实现

大家好&#xff0c;今天给大家分享一下最基础的数据结构--顺序表的实现&#xff0c;其实顺序表与我们的数组相似&#xff0c;但是顺序表存储数据必须是连续的&#xff0c;不能像数组一样存储在任意下标&#xff0c;那么我们就来看看顺序表的代码。 SeqList.h SeqList.c 那么今…...

优化Go语言中的网络连接:设置代理超时参数

网络连接优化的重要性 在分布式系统和微服务架构中&#xff0c;网络请求的效率直接影响到整个系统的响应速度。合理的超时设置可以防止系统在等待网络响应时陷入无限期的阻塞&#xff0c;从而提高系统的吞吐量和用户体验。特别是在使用代理服务器时&#xff0c;由于增加了网络…...

活动|华院计算董事长宣晓华出席第十五届田长霖论坛会议

12月11日&#xff0c;2024年光谷田长霖中心科技文化交流大会暨第十五届田长霖论坛会议举行&#xff0c;300多位院士专家、大学校长、青年学者和优秀企业家齐聚光谷。 华院计算技术&#xff08;上海&#xff09;股份有限公司&#xff08;以下简称“华院计算”&#xff09;创始人…...

qt-C++语法笔记之mapToGlobal将组件(控件)中的本地坐标系(局部坐标)映射到全局坐标系

qt-C语法笔记之mapToGlobal将组件&#xff08;控件&#xff09;中的本地坐标系&#xff08;局部坐标&#xff09;映射到全局坐标系 code review! 文章目录 qt-C语法笔记之mapToGlobal将组件&#xff08;控件&#xff09;中的本地坐标系&#xff08;局部坐标&#xff09;映射到…...

设计一个高效的Java多线程应用程序及案例

《剑来》 勇敢追梦&#xff1a;“如果真的有那么喜欢苏姑娘&#xff0c;既然这辈子到最后也没能说出口喜欢她&#xff0c;没关系&#xff0c;以后数十年百余年&#xff0c;哪怕找遍人间&#xff0c;你都要去再见她一次&#xff0c;大声告诉她&#xff0c;自己喜欢她。” 正视困…...

基于最新的Apache StreamPark搭建指南

一、StreamPark 的介绍 官方文档:Apache StreamPark (incubating) | Apache StreamPark (incubating) 中文文档:Apache StreamPark (incubating) | Apache StreamPark (incubating)Github地址:https://github.com/apache/incubator-streampark Apache StreamPark™ 是一个…...

迎接全新的 Kotlin 支持 – K2 模式:基本信息

K2 模式有什么作用&#xff1f; K2 模式是 IntelliJ IDEA 中 Kotlin 支持的新实现&#xff0c;它可以提高 IDE 的稳定性&#xff0c;同时也会为支持未来 Kotlin 语言功能奠定基础。 K2 模式与 Kotlin K2 编译器有什么区别&#xff1f; K2 编译器负责编译 Kotlin 语言 2.0 或…...

阿里云元宇宙

在数字经济时代&#xff0c;技术的迅猛发展带来了前所未有的机遇与挑战&#xff0c;元宇宙正逐步成为全球科技与商业创新的热点。作为中国云计算和人工智能领域的领导者&#xff0c;阿里云通过其强大的技术能力&#xff0c;推出了全面的阿里云元宇宙解决方案&#xff0c;为全球…...

题目 1688: 数据结构-字符串插入

第一种方式字符串 #include<iostream> #include<cstring> #include<algorithm> using namespace std; int main(){string s1,s2;int n;cin>>s1>>s2>>n;s1.insert(n-1,s2);cout<<s1<<endl;return 0; } 第二种方式字符数组 …...

MetaGPT中的教程助手:TutorialAssistant

1. 提示词 COMMON_PROMPT """ You are now a seasoned technical professional in the field of the internet. We need you to write a technical tutorial with the topic "{topic}". """DIRECTORY_PROMPT (COMMON_PROMPT "…...

如何将Python程序打包发布,实现一键安装

哈喽,大家好,我是木头左! 编写完Python脚本后,如何将其高效地发布并安装到其他计算机上,。本文将详细介绍如何将Python程序打包发布,实现一键安装,让程序的分发与部署变得轻松便捷。 一、准备工作 1. 编写和测试程序 在开始打包之前,首先要确保你的Python程序已经编…...

Java 接口

1. 接口概述 (1) Java提供了一个关键字 interface&#xff0c;用这个关键字可以定义接口&#xff1b; (2)格式&#xff1a; public interface 接口名{ //成员变量(常量) //成员方法(抽象方法) } public interface A {//成员变量(接口默认为常量-public static final)String NA…...

RTMP推流平台EasyDSS在无人机推流直播安防监控中的创新应用

无人机与低空经济的关系密切&#xff0c;并且正在快速发展。2024年中国低空经济行业市场规模达到5800亿元&#xff0c;其中低空制造产业占整个低空经济产业的88%。预计未来五年复合增速将达到16.03%。 随着科技的飞速发展&#xff0c;公共安防关乎每一个市民的生命财产安全。在…...

【Flutter_Web】Flutter编译Web第一篇(插件篇):Flutter_web实现上传TOS上传资源,编写web插件

前言 由于Flutter在双端的开发体验几乎接近的情况下&#xff0c;尝试将Flutter代码转Web端进行部署和发布&#xff0c;在其中遇到的所有问题&#xff0c;我都会通过这种方式分享出来。那么第一个要解决的就是上传资源到TOS上&#xff0c;在双端中都是通过插件的方式在各端通过…...

SpringBoot 项目使用 EasyExcel 插件构建 Excel 表格格式(行高、列宽和字体等)工具类

本文主要讲了如何使用 EasyExcel 插件&#xff0c;在导出 Excel 时&#xff0c;设置行高&#xff0c;列宽&#xff0c;表头格式&#xff0c;内容字体大小等工具类。 1、代码使用的依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyex…...

数据优化带来的问题

原因大概可以猜到 等待进一步深究&#xff08;必须一个是浮点型&#xff09; double x 1 / 2;double x2 static_cast<double> (1 / 2);double x3 (double)1 / (double)2;double x4 (double)1 / 2;double x5 1 / (double)2;double nTotalDataCount 78182;double n…...

2024153读书笔记|《春烂漫:新平摄影作品选》——跳绳酷似人生路,起落平常,进退平常,莫惧征途万里长

2024153读书笔记|《春烂漫&#xff1a;新平摄影作品选》——跳绳酷似人生路&#xff0c;起落平常&#xff0c;进退平常&#xff0c;莫惧征途万里长 《春烂漫&#xff1a;新平摄影作品选》作者新平&#xff0c;2019.12.25年读完的小书&#xff0c;当时就觉得挺不错&#xff0c;今…...

RabbitMQ个人理解与基本使用

目录 一. 作用&#xff1a; 二. RabbitMQ的5中队列模式&#xff1a; 1. 简单模式 2. Work模式 3. 发布/订阅模式 4. 路由模式 5. 主题模式 三. 消息持久化&#xff1a; 消息过期时间 ACK应答 四. 同步接收和异步接收&#xff1a; 应用场景 五. 基本使用 &#xff…...

每天40分玩转Django:Django视图和URL

Django视图和URL 一、课程概述 学习项目具体内容预计用时视图基础函数视图、类视图、视图装饰器90分钟URL配置URL模式、路由系统、命名URL60分钟请求处理请求对象、响应对象、中间件90分钟 二、视图基础 2.1 函数视图 # blog/views.py from django.shortcuts import render…...