java/python——两个行为(操作)满足原子性的实现
目录
- JAVA
- 方法 1:使用 synchronized 同步块
- 示例代码
- 方法 2:使用 ReentrantLock锁
- 示例代码
- 方法 3:使用 AtomicReference 或其他原子类
- 示例代码
- 方法 4:使用数据库事务(如果涉及数据库操作)
- 示例代码(使用 JDBC)
- 方法 5:使用本地队列和后台线程
- 示例代码
- 总结
- android开发拓展:使用回调机制(确保发送成功后再添加)
- Python
- 1. 使用线程锁(threading.Lock)
- 示例代码
- 2. 使用数据库事务
- 示例代码(使用 SQLAlchemy)
- 3. 使用 queue.Queue
- 示例代码
- 4. 使用 contextlib 和 contextvars
- 示例代码
- 输出
- 5. 使用 asyncio 和 asyncio.Lock
- 示例:异步任务中的锁
- 输出
- 总结
JAVA
在 Java 中,如果需要确保两个行为(操作)满足原子性,即要么两个操作都成功,要么都不执行,可以使用以下几种方法来实现:
方法 1:使用 synchronized 同步块
synchronized
是 Java 中最简单的同步机制之一,可以确保同一时刻只有一个线程可以执行同步块中的代码。通过将两个操作放在同一个 synchronized
块中,可以确保它们的原子性。
示例代码
import com.google.gson.Gson;
import io.socket.client.Socket;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class MessageManager {private List<Message> messageList = new ArrayList<>();private Socket socket;private Gson gson = new Gson();private final Lock lock = new ReentrantLock();public MessageManager(Socket socket) {this.socket = socket;}public void sendMessage(Message message) {lock.lock();try {// 将消息添加到列表末尾messageList.add(message);// 将消息发送到服务器socket.emit("message", gson.toJson(message));} finally {lock.unlock();}}public List<Message> getMessageList() {return messageList;}
}
在这个例子中,两个操作是原子性的。
可以通过同步块来确保操作的原子性。将消息添加到列表和发送消息的操作放在同一个同步块中,确保它们在同一时间只能被一个线程执行。
方法 2:使用 ReentrantLock锁
希望进一步优化性能,可以将消息先添加到一个本地队列中,然后在后台线程中批量处理消息发送和列表更新。这样可以减少锁的使用频率,提高性能。
ReentrantLock
是 Java 提供的一种显式锁机制,比 synchronized
更灵活。它允许更复杂的锁操作,例如尝试锁定(tryLock
)、设置超时时间等。
示例代码
import com.google.gson.Gson;
import io.socket.client.Socket;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class MessageManager {private List<Message> messageList = new ArrayList<>();private Socket socket;private Gson gson = new Gson();private final Lock lock = new ReentrantLock();private final BlockingQueue<Message> messageQueue = new LinkedBlockingQueue<>();public MessageManager(Socket socket) {this.socket = socket;// 启动一个后台线程来处理消息队列new Thread(this::processMessageQueue).start();}public void sendMessage(Message message) {// 将消息添加到队列中messageQueue.add(message);}private void processMessageQueue() {while (true) {try {// 从队列中获取消息Message message = messageQueue.take();lock.lock();try {// 将消息添加到列表末尾messageList.add(message);// 将消息发送到服务器socket.emit("message", gson.toJson(message));} finally {lock.unlock();}} catch (InterruptedException e) {Thread.currentThread().interrupt();break;}}}public List<Message> getMessageList() {return messageList;}
}
在这个例子中,lock.lock()
和 lock.unlock()
确保了两个操作的原子性。finally
块确保即使发生异常,锁也会被正确释放。
方法 3:使用 AtomicReference 或其他原子类
如果两个操作可以封装在一个对象中,可以使用 AtomicReference
或其他原子类来实现原子性。这种方法适用于需要对复杂对象进行原子操作的场景。
示例代码
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;public class AtomicOperations {private List<String> messageList = new ArrayList<>();private AtomicReference<String> lastMessage = new AtomicReference<>();public void performAtomicOperations(String message) {// 操作 1:将消息添加到列表messageList.add(message);// 操作 2:更新 lastMessagelastMessage.set(message);// 打印消息System.out.println("Message added: " + message);}public List<String> getMessageList() {return messageList;}public String getLastMessage() {return lastMessage.get();}
}
在这个例子中,AtomicReference
确保了对 lastMessage
的更新是原子性的。
方法 4:使用数据库事务(如果涉及数据库操作)
如果两个操作涉及数据库操作,可以使用数据库事务来确保原子性。通过事务机制,可以确保一组操作要么全部成功提交,要么全部回滚。
示例代码(使用 JDBC)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class AtomicOperations {private String dbUrl = "jdbc:mysql://localhost:3306/mydatabase";private String dbUser = "root";private String dbPassword = "password";public void performAtomicOperations(String message) {Connection conn = null;try {conn = DriverManager.getConnection(dbUrl, dbUser, dbPassword);conn.setAutoCommit(false); // 禁用自动提交// 操作 1:将消息插入数据库String sql = "INSERT INTO messages (content) VALUES (?)";try (PreparedStatement pstmt = conn.prepareStatement(sql)) {pstmt.setString(1, message);pstmt.executeUpdate();}// 操作 2:更新某个状态sql = "UPDATE status SET last_message = ?";try (PreparedStatement pstmt = conn.prepareStatement(sql)) {pstmt.setString(1, message);pstmt.executeUpdate();}// 提交事务conn.commit();} catch (SQLException e) {if (conn != null) {try {conn.rollback(); // 回滚事务} catch (SQLException ex) {ex.printStackTrace();}}e.printStackTrace();} finally {if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}
}
在这个例子中,通过 conn.setAutoCommit(false)
禁用了自动提交,然后在两个操作成功后调用 conn.commit()
提交事务。如果发生异常,调用 conn.rollback()
回滚事务。
方法 5:使用本地队列和后台线程
如果两个操作的执行时间较长,可以将它们放入一个本地队列中,然后在后台线程中批量处理。这样可以减少锁的使用频率,提高性能。
示例代码
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.locks.ReentrantLock;public class AtomicOperations {private List<String> messageList = new ArrayList<>();private final ReentrantLock lock = new ReentrantLock();private final BlockingQueue<String> messageQueue = new LinkedBlockingQueue<>();public AtomicOperations() {// 启动一个后台线程来处理消息队列new Thread(this::processMessageQueue).start();}public void sendMessage(String message) {messageQueue.add(message);}private void processMessageQueue() {while (true) {try {// 从队列中获取消息String message = messageQueue.take();lock.lock();try {// 操作 1:将消息添加到列表messageList.add(message);// 操作 2:打印消息System.out.println("Message added: " + message);} finally {lock.unlock();}} catch (InterruptedException e) {Thread.currentThread().interrupt();break;}}}public List<String> getMessageList() {return messageList;}
}
在这个例子中,消息首先被添加到 messageQueue
中,然后在后台线程中批量处理。通过 lock.lock()
和 lock.unlock()
确保了两个操作的原子性。
总结
synchronized
同步块:简单易用,适用于简单的同步需求。ReentrantLock
:更灵活,适用于复杂的同步需求。- 原子类(如
AtomicReference
):适用于对单个对象的原子操作。 - 数据库事务:适用于涉及数据库操作的场景。
- 本地队列和后台线程:适用于高并发场景,可以提高性能。
android开发拓展:使用回调机制(确保发送成功后再添加)
如果你需要确保消息成功发送到服务器后才将其添加到列表中,可以使用回调机制。socket.emit
方法通常支持回调函数,可以在消息成功发送后执行回调。
以下是一个示例代码:
import com.google.gson.Gson;
import io.socket.client.Socket;import java.util.ArrayList;
import java.util.List;public class MessageManager {private List<Message> messageList = new ArrayList<>();private Socket socket;private Gson gson = new Gson();public MessageManager(Socket socket) {this.socket = socket;}public void sendMessage(Message message) {// 将消息发送到服务器,并在回调中处理成功或失败socket.emit("message", gson.toJson(message), new Ack() {@Overridepublic void call(Object... args) {// 如果发送成功,将消息添加到列表messageList.add(message);}});}public List<Message> getMessageList() {return messageList;}
}
Python
在 Python 中,实现两个行为的原子性可以通过多种方式,具体取决于操作的类型(例如是否涉及 I/O、数据库操作等)。以下是几种常见的方法:
1. 使用线程锁(threading.Lock)
如果两个操作需要在多线程环境中保持原子性,可以使用 threading.Lock
来确保它们在同一时间只能被一个线程执行。
示例代码
import threadingclass AtomicOperations:def __init__(self):self.message_list = []self.lock = threading.Lock()def perform_atomic_operations(self, message):with self.lock:# 操作 1:将消息添加到列表self.message_list.append(message)# 操作 2:打印消息print(f"Message added: {message}")# 示例使用
atomic_ops = AtomicOperations()
atomic_ops.perform_atomic_operations("Hello, World!")
在这个例子中,with self.lock
确保了 self.message_list.append(message)
和 print(f"Message added: {message}")
两个操作是原子性的。
2. 使用数据库事务
如果两个操作涉及数据库操作,可以使用数据库事务来确保原子性。通过事务机制,可以确保一组操作要么全部成功提交,要么全部回滚。
示例代码(使用 SQLAlchemy)
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmakerBase = declarative_base()class Message(Base):__tablename__ = 'messages'id = Column(Integer, primary_key=True)content = Column(String)# 创建数据库引擎和会话
engine = create_engine('sqlite:///example.db')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()def perform_atomic_operations(message):try:# 操作 1:将消息插入数据库new_message = Message(content=message)session.add(new_message)# 操作 2:更新某个状态(示例)session.query(Message).update({Message.content: message}, synchronize_session=False)# 提交事务session.commit()print(f"Message added: {message}")except Exception as e:# 回滚事务session.rollback()print(f"Failed to add message: {e}")# 示例使用
perform_atomic_operations("Hello, World!")
在这个例子中,通过 session.commit()
提交事务,如果发生异常则调用 session.rollback()
回滚事务。
3. 使用 queue.Queue
queue.Queue 是一个线程安全的队列实现,非常适合在多线程环境中按顺序执行任务。它可以帮助你将任务排队,然后在后台线程中逐一处理这些任务,确保操作的顺序性和线程安全性。
如果两个操作需要在多线程环境中按顺序执行,可以使用 queue.Queue
来确保它们的原子性。queue.Queue
是线程安全的,可以用于在多线程之间传递消息。
示例代码
import threading
import queueclass AtomicOperations:def __init__(self):self.message_list = []self.message_queue = queue.Queue()def worker(self):while True:message = self.message_queue.get()if message is None:break# 操作 1:将消息添加到列表self.message_list.append(message)# 操作 2:打印消息print(f"Message added: {message}")self.message_queue.task_done()def perform_atomic_operations(self, message):self.message_queue.put(message)def start_worker(self):threading.Thread(target=self.worker, daemon=True).start()# 示例使用
atomic_ops = AtomicOperations()
atomic_ops.start_worker()
atomic_ops.perform_atomic_operations("Hello, World!")
atomic_ops.message_queue.join() # 等待队列中的所有任务完成
在这个例子中,message_queue
确保了消息的处理是线程安全的。
4. 使用 contextlib 和 contextvars
contextlib
和 contextvars
可以用于在异步环境中保持原子性。contextvars 提供了上下文变量,可以在异步任务之间传递状态,而 contextlib
提供了上下文管理器,可以确保操作的原子性。
示例代码
import asyncio
import contextvars
import contextlib# 定义一个上下文变量
message_var = contextvars.ContextVar('message_var')# 定义一个上下文管理器
@contextlib.contextmanager
def atomic_operations():token = message_var.set("Initial value") # 设置初始值try:yieldfinally:message_var.reset(token) # 恢复原始值async def process_message(message):with atomic_operations():# 操作 1:设置上下文变量message_var.set(message)# 操作 2:打印消息print(f"Processing message: {message_var.get()}")# 模拟异步操作await asyncio.sleep(1)# 操作 3:再次打印消息print(f"Finished processing message: {message_var.get()}")async def main():await asyncio.gather(process_message("Hello"),process_message("World"))# 运行异步主函数
asyncio.run(main())
输出
Processing message: Hello
Processing message: World
Finished processing message: Hello
Finished processing message: World
5. 使用 asyncio 和 asyncio.Lock
asyncio.Lock
是一个异步锁,用于在异步环境中确保操作的原子性。它可以帮助你确保在多个异步任务中,某些操作不会同时被执行。
示例:异步任务中的锁
假设你有一个异步任务,需要确保某些操作是原子性的。
import asyncioclass MessageProcessor:def __init__(self):self.message_list = []self.lock = asyncio.Lock()async def add_message(self, message):async with self.lock:# 操作 1:将消息添加到列表self.message_list.append(message)# 操作 2:打印消息print(f"Message added: {message}")async def main():processor = MessageProcessor()async def task(message):await processor.add_message(message)await asyncio.gather(task("Hello"),task("World"),task("Python"))print("Final message list:", processor.message_list)# 运行异步主函数
asyncio.run(main())
输出
Message added: Hello
Message added: World
Message added: Python
Final message list: ['Hello', 'World', 'Python']
总结
- 线程锁(
threading.Lock
):适用于多线程环境。 - 数据库事务:适用于涉及数据库操作的场景。
- 队列(
queue.Queue
):适用于多线程环境中按顺序执行操作。 - 上下文管理器(
contextlib
和contextvars
):适用于需要在异步环境中保持原子性的场景。 - 异步锁(
asyncio.Lock
):适用于异步环境。
相关文章:
java/python——两个行为(操作)满足原子性的实现
目录 JAVA方法 1:使用 synchronized 同步块示例代码 方法 2:使用 ReentrantLock锁示例代码 方法 3:使用 AtomicReference 或其他原子类示例代码 方法 4:使用数据库事务(如果涉及数据库操作)示例代码&#x…...
SpringBoot中配置文件的加载顺序
下面的优先级由高到低 命令行参数java系统属性java系统环境变量外部config文件夹的application-{profile}.ym文件外部的application-{profile}.ym文件内部config文件夹的application-{profile}.ym文件内部的application-{profile}.ym文件外部config文件夹的application.ym文件外…...
Nginx下搭建rtmp流媒体服务 并使用HLS或者OBS测试
所需下载地址: 通过网盘分享的文件:rtmp 链接: https://pan.baidu.com/s/1t21J7cOzQR1ASLrsmrYshA?pwd0000 提取码: 0000 window: 解压 win目录下的 nginx-rtmp-module-1.2.2.zip和nginx 1.7.11.3 Gryphon.zip安装包,解压时选…...
在线查看【免费】 txt, xml(渲染), md(渲染), java, php, py, js, css 文件格式网站
可以免费在线查看 .docx/wps/Office/wmf/ psd/ psd/eml/epub/dwg, dxf/ txt/zip, rar/ jpg/mp3 m.gszh.xyz m.gszh.xyz 免费支持以下格式文件在线查看类型 支持 doc, docx, xls, xlsx, xlsm, ppt, pptx, csv, tsv, dotm, xlt, xltm, dot, dotx, xlam, xla, pages 等 Office 办…...
RIP动态路由(三层交换机+单臂路由)
RIP动态路由(三层交换机单臂路由) J1 (配置VLAN,修改端口) Switch>en Switch>en Switch# Switch#conf t Enter configuration commands, one per line. End with CNTL/Z. Switch(config)#int f0/1 Switch(config-if)#sw Switch(confi…...
Docker 基本概念与安装指南
Docker 基本概念与安装指南 一、Docker 核心概念 1. 容器(Container) 容器是 Docker 的核心运行单元,本质是一个轻量级的沙盒环境。它基于镜像创建,包含应用程序及其运行所需的依赖(如代码、库、环境变量等…...
Oracle DBA培训一般多长时间?
Oracle DBA培训的时间通常在2个月到6个月之间,具体看课程类型和你的学习目标。不过别只看总时长,关键得看每天学什么、练什么——有些机构把时间拖到半年,结果全是理论;有些课程压缩到2个月,但全是干货。下面分情况…...
【回眸】Linux 内核 (十七) 之 网络编程
前言 努力赶紧把Linux内核的内容更新完。 网络编程 协议的部分已经很成熟,只需要调用即可。 进程间通讯无法进行多机通信,网络通讯则解决了这一缺陷。 TCP/UDP协议对比 (1)TCP 面向连接(如打电话要先拨号建立连接…...
Batch Size
1. 什么是Batch Size? Batch Size(批大小)是指在深度学习模型训练过程中,每次前向传播和反向传播时输入到模型中的样本数量。具体来说,深度学习模型的训练通常基于梯度下降(Gradient Descent)算…...
Maven插件管理的基本原理
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
flutter 专题 六十三 Flutter入门与实战作者:xiangzhihong8Fluter 应用调试
Fluter 应用调试 Flutter 构建模式 目前,Flutter一共提供了三种运行模式,分别是Debug、Release和Profile模式。其中,Debug模式主要用在软件编写过程中,Release模式主要用于应用发布过程中,而Profile模式则主要用于应…...
MySQL-存储过程--游标
存储过程 游标 什么是游标 一个游标是一个SQL语句执行时系统内存创建的一个临时工作区域。一个游标包含一个查询语句的信息和它操作的数据行的信息。 mysql游标的特点 只读: 无法通过游标更新基础表中的数据不可滚动: 只能根据select中确定的顺序来…...
Spring AOP 事务
目录 一,引入依赖: 二,切面 1,基本概念 2, 通知类型: 3,Pointcut 4, 切面优先级: 5 ,自定义优先级Order 6,切点表达式 7, 自定义注解 总结: AOP有几种创建方式 三, Spring AOP原理 1, 代理模式 (1)静态代理 (2)动态代理 △JDK动态代理 △CGLIB动态代理 JDB和c…...
Itext进行PDF的编辑开发
这周写了一周的需求,是制作一个PDF生成功能,其中用到了Itext来制作PDF的视觉效果。其中一些功能不是很懂,仅作记录,若要学习请仔细甄别正确与否。 开始之前,我还是想说,这傻福需求怎么想出来的,…...
Python 中消费者 - 生产者模式详解
目录 引言 消费者 - 生产者模式原理 示例场景 Python 实现消费者 - 生产者模式 使用队列(Queue)实现 代码解释 使用协程实现 代码解释 应用场景 总结 引言 在软件开发里,消费者 - 生产者模式是一种常见且重要的设计模式。这种模式让…...
基于Hadoop的音乐推荐系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 本毕业生数据分析与可视化系统采用B/S架构,数据库是MySQL,网站的搭建与开发采用了先进的Java语言、爬虫技术进行编写,使用了Spring Boot框架。该系统从两个对象:由管理员和用户来对系统进行设计构建。主要功能包括ÿ…...
移动端动态滑动拨盘选择器【Axure元件库】
模拟移动端底部对话框效果,制作的年份、日期滑动拨盘选择器,支持日期动态滑动选择,提升原型制作强度。 该模板主要使用中继器、动态面板和矩形制作,使用简单,复用性强。只需对中继器数据表格中的数据项进行修改、增删…...
7. 深入Spring AI:刨析 Advisors 机制
目录 1、序言2、什么是Advisor?3、源码分析Advisor3.1、Advisor接口3.2、Advisor Ordered3.3、CallAroundAdvisor & StreamAroundAdvisor3.4、BaseAdvisor4、内置的Advisor类型4.1、MessageChatMemoryAdvisor4.2、PromptChatMemoryAdvisor4.3、VectorStoreChatMemoryAdvis…...
高保真动态项目管理图表集
本作品为项目管理图表类原型,以关系图谱、甘特图、流程图、泳道图为核心,提供基础的图表设计风格和交互案例,再进阶到高级的动态交互设计,由浅入深诠释Axure设计高端复杂的动态交互设计的魅力。 作品介绍 原型名称:Ax…...
MCP:AI时代的“万能插座”,开启大模型无限可能
摘要:Model Context Protocol(MCP)由Anthropic在2024年底开源,旨在统一大模型与外部工具、数据源的通信标准。采用客户端-服务器架构,基于JSON-RPC 2.0协议,支持stdio、SSE、Streamable HTTP等多种通信方式…...
IDEA打不开、打开报错
目录 场景异常原因解决 场景 1、本机已经安装了IDEA 2、再次安装另外一个版本的IDEA后打不开、打开报错 异常 这里忘记截图了。。。 原因 情况1-打不开:在同一台电脑安装多个IDEA是需要对idea的配置文件进行调整的,否则打不开 情况2-打开报错&#…...
TM1640学习手册及示例代码
数据手册 TM1640数据手册 数据手册解读 这里我们看管脚定义DIN和SCLK,一个数据线一个时钟线 SEG1~SEG8为段码,GRID1~GRID16为位码(共阴极情况下) 这里VDD给5V 数据指令 数据命令设置 地址命令设置 显示控制命令 共阴极硬件连接图…...
动态规划-零钱兑换
332.零钱兑换 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无…...
leetcode50.pow(x,n)
class Solution {private double f(double x,long n){if(n0)return 1.0;else {double tempf(x,n/2);return n%21?temp*temp*x:temp*temp;}}public double myPow(double x, int n) {long Nn;return n>0?f(x,N):1.0/f(x,-N);} }...
ECA 注意力机制:让你的卷积神经网络更上一层楼
ECA 注意力机制:让你的卷积神经网络更上一层楼 在深度学习领域,注意力机制已经成为提升模型性能的重要手段。从自注意力(Self-Attention)到各种变体,研究人员不断探索更高效、更有效的注意方法。今天我们要介绍一种轻…...
《谷歌Gemini 1.5:长语境理解重塑文档分析与检索新格局》
在人工智能的快速发展进程中,大语言模型不断突破边界,为各个领域带来变革性影响。谷歌Gemini 1.5的问世,凭借其卓越的长语境理解能力,在文档分析和检索任务方面掀起了一阵技术革新的浪潮。 以往的大语言模型在处理长文本时&#…...
量变与质变的辩证关系
量变和质变是唯物辩证法中揭示事物发展状态和形式的一对重要范畴,二者之间存在着密切的辩证关系。 一、量变是质变的必要准备 含义 量变是指事物数量的增减和场所的变更,是一种渐进的、不显著的变化。例如,水的温度升高,从0℃逐…...
讯联桌面TV版apk下载-讯联桌面安卓电视版免费下载安装教程
在智能电视的使用过程中,一款好用的桌面应用能极大提升我们的使用体验。讯联桌面 TV 版就是这样一款备受关注的应用,它可以让安卓电视拥有更个性化、便捷的操作界面。今天,就为大家详细介绍讯联桌面 TV 版 apk 的免费下载安装教程。 一、下载…...
【Vue】组件基础
目录 🚀 Vue 非单文件组件 和 单文件组件 的区别与实践对比 ✨ 引言 一、非单文件组件 1. 基本使用 2. 注意: 3. 组件的嵌套 4. 关于VueComponent: 5. 一个重要的内置关系(有点难理解) 二、 单文件组件 那就…...
OpenCV---图像预处理(四)
OpenCV—图像预处理(四) 文章目录 OpenCV---图像预处理(四)九,图像掩膜9.1 制作掩膜9.2 与运算9.3 颜色替换9.3.19.3.2 颜色替换 十,ROI切割十 一,图像添加水印11.1模板输入11.2 与运算11.3 图像…...
《MySQL:MySQL表的基本查询操作CRUD》
CRUD:Create(创建)、Retrieve(读取)、Update(更新)、Delete(删除)。 Create into 可以省略。 插入否则更新 由于主键或唯一键冲突而导致插入失败。 可以选择性的进行同步…...
Psychology 101 期末测验(附答案)
欢呼 啦啦啦~啦啦啦~♪(^∇^*) 终于考过啦~ 开心(*^▽^*) 撒花✿✿ヽ(▽)ノ✿ |必须晒下证书: 判卷 记录下判卷,还是错了几道,填空题2道压根填不上。惭愧~ 答案我隐藏了,实在想不出答案的朋友可以留言,不定时回复。 建议还是认认真真的学习~认认真真的考试~,知识就…...
Linux:权限相关问题
文章目录 shell命令以及运行的原理Linux权限 shell命令以及运行的原理 操作系统分为内核和外壳程序,xshell是外壳程序,外壳程序包括我们windows桌面上的图形化界面,本质都是翻译给核心处理,再显示出来,而我们输入的命令…...
大模型应用开发大纲
AI大模型学习路径脑图结构 一、AI及LLM基础 学习目标:建立对AI和LLM的基础理解,了解主要的机器学习和神经网络模型,掌握API调用方法。 1.1 AI领域基础概念 AI, NL/NLU/NLG机器学习: 学习方法, 拟合评估神经网络: CNN, RNN, TransformerTra…...
【NCCL】transport建立(一)
transport建立 NCCL transport建立主要在ncclTransportP2pSetup函数中实现。 概况 先简单概括一下ncclTransportP2pSetup函数做了哪些事,方便理解代码流程。 recvpeer 表示本卡作为接收端的对端,sendpeer 表示本卡作为发送端的对端。假设8个rank全连接…...
智慧能源安全新纪元:当能源监测遇上视频联网的无限可能
引言:在数字化浪潮席卷全球的今天,能源安全已成为国家安全战略的重要组成部分。如何构建更加智能、高效的能源安全保障体系?能源安全监测平台与视频监控联网平台的深度融合,正为我们开启一扇通向未来能源管理新世界的大门。这种创…...
腾讯一面-软件开发实习-PC客户端开发方向
1.自我介绍就不多赘述了 2. 请介绍一下你的项目经历 - 介绍了专辑鉴赏项目,前端使用html语言编写,后端基于http协议使用C语言进行网页开发。此外,还提及项目中涉及处理多线程问题以及做过内存池管理项目。 3. 项目中HTTP协议是使用库实现的…...
Cad c# 射线法判断点在多边形内外
1、向量叉乘法 2、射线法原理 射线法是判断点与多边形位置关系的经典算法,核心思想是: 从目标点发出一条水平向右的射线(数学上可视为 y p_y, x \geq p_x 的射线),统计该射线与多边形边的交点数量: - 偶…...
【第16届蓝桥杯软件赛】CB组第一次省赛
个人主页:Guiat 归属专栏:算法竞赛 文章目录 A. 移动距离(5分填空题)B. 客流量上限(5分填空题)C. 可分解的正整数D. 产值调整E. 画展布置F. 水质检测G. 生产车间H. 装修报价 正文 总共10道题。 A. 移动距离…...
DePIN驱动的分布式AI资源网络
GAEA通过通证经济模型激励全球用户共享闲置带宽、算力、存储资源,构建覆盖150多个国家/地区的分布式AI基础设施网络。相比传统云服务,GAEA具有显著优势: 成本降低70%:通过利用边缘设备资源,避免了集中式数据中心所需…...
CC注入Tomcat Upgrade/Executor/WebSocket内存马
学习一下Tomcat中和组件内存马不一样的马。除了学习注入原理外,其payload还在一些缩短payload的场景有应用,比如shiro CC注入Tomcat Upgrade/Executor/WebSocket内存马 漏洞所用环境及测试全部代码https://github.com/godownio/TomcatMemshell 漏洞路…...
算法工程师面试题与参考答案资料(2025年版)
一、核心技术能力 1. 编程能力与工具 问题 1(选择题): 下列哪种Python数据类型是通过哈希表实现的? A. 列表 (list)...
烂土豆Juicypotato提权原理和利用
烂土豆Juicypotato提权原理和利用 0x00 Potato(烂土豆)提权的原理: 所谓的烂土豆提权就是俗称的MS16-075 可以将Windows工作站上的特权从最低级别提升到“ NT AUTHORITY \ SYSTEM” – Windows计算机上可用的最高特权级别。 一、简单的原…...
基于LangChain4J的AI Services实践:用声明式接口重构LLM应用开发
基于LangChain4J的AI Services实践:用声明式接口重构LLM应用开发 前言:当Java开发遇上LLM编程困境 在LLM应用开发领域,Java开发者常面临两大痛点:一是需要手动编排Prompt工程、记忆管理和结果解析等底层组件,二是复杂…...
重构便携钢琴专业边界丨特伦斯便携钢琴V30Pro定义新一代便携电钢琴
在便携电钢琴领域,特伦斯推出的V30Pro折叠钢琴以"技术革新场景适配"的双重升级引发关注。这款产品不仅延续了品牌标志性的折叠结构,更通过声学系统重构与智能交互优化,重新定义了便携乐器的专业边界。 ▶ 核心特点:技术…...
【uniapp-兼容性处理】安卓uView组件中u-input后置插槽不展示
【日期】2025-04-21 【问题】 在小程序上u-input后置插槽展示,真机运行安卓机上不展示 【原因】: 原代码:(插槽写法惯性使用#,此处在APP上不兼容该写法) <u-input v-model"currentScore"…...
每天学一个 Linux 命令(30):cut
可访问网站查看,视觉品味拉满: http://www.616vip.cn/28/index.html cut 命令用于从文件或输入流中提取文本的特定部分(如列、字符或字节位置)。它常用于处理结构化数据(如 CSV、TSV)或按固定格式分割的文本。以下是详细说明和示例: 命令格式 cut [选项] [文件...]…...
部署本地Dify
本文我们来演示一下Dify的部署安装。 一、安装docker环境 Dify只是一个dashboard,所以这里的话咱们一般不用使用物理部署了,直接使用docker启动一个即可,所以一定要先确保服务器上有docker环境和docker-compose环境。 docker的安装可参考&…...
大数据组件学习之--Kafka 安装搭建
一、前置环境 在搭建kafka之前,请确认自己的hadoop、zookeeper是否搭建完成且可正常运行 二、下载并上传安装包(链接为百度网盘) kafka安装包 tar -zxvf /opt/software/kafka_2.12-2.4.1.tgz -C /opt/module/ 进入解压后的目录更改文件名…...
RK3588芯片NPU的使用:PPOCRv4例子在安卓系统部署
本文的目标 将PPOCRv4 C语言例子适配安卓端,提供选择图片后进行OCR识别功能。PPOCRv4 C语言例子请参考之前的博文《RK3588芯片NPU的使用:Windows11 Docker中运行PPOCRv4例子》。 开发环境说明 主机系统:Windows 11目标设备:搭载RK3588芯片的安卓开发板核心工具:Android …...