IO模型之于并发编程模型、并发模型之于架构模式
一、并发编程模型主要包括以下几种:
-
多进程模型:利用操作系统的进程模型来实现并发。每个用户请求接入时都会创建一个进程,适用于I/O密集型任务。缺点是创建进程的开销高,且上下文切换的开销也大。典型应用如Apache Web Server1。
-
多线程模型:通过创建多个线程来实现并发。线程比进程创建的系统开销小,但线程间通信复杂,需要解决竞态条件问题。多线程可以通过共享内存或消息传递方式进行通信1。
-
协程模型:协程在用户态进行调度,避免了线程创建和上下文切换的开销,适合高并发场景。协程与线程的关系是N:1,即多个协程共享一个线程,这种模型在GOLANG和SCALA等语言中广泛应用2。
-
IO多路复用模型:通过单个线程或进程监听多个I/O事件,适用于高并发场景。常见的实现方式有select, poll和epoll。这种模型可以显著减少系统资源的消耗,提高系统的响应速度3。
-
事件驱动模型:基于事件触发机制进行编程,当特定事件发生时才执行相应的处理函数。适用于处理高并发事件,如Node.js和React等框架。
-
消息队列模型:通过消息队列来处理并发任务,适用于解耦和异步处理。消息队列如RabbitMQ和Kafka,可以有效地处理高并发场景下的任务调度和消息传递4。
=》每一类并发模型中:又包含多种模型框架!!
这些并发编程模型各有优缺点,适用于不同的应用场景。选择合适的并发模型可以提高程序的性能和稳定性。
二、IO模型 和 并发模型的关系
IO模型和并发模型是软件设计中密切相关的两个概念,但它们关注的问题和解决的目标不同。它们通常需要协同工作以构建高性能的系统,尤其是在高并发、高吞吐量的场景下(如Web服务器、实时通信系统等)。以下是两者的核心区别与联系:
1. 核心定义与关注点
维度 | IO模型 | 并发模型 |
---|---|---|
定义 | 定义程序如何处理输入输出操作(如读写文件、网络通信),解决IO操作的等待与阻塞问题。 | 定义程序如何管理多个执行单元(如线程、协程、进程),解决任务的并行或并发执行问题。 |
关注点 | 如何高效利用CPU时间,避免因IO等待导致资源浪费。 | 如何协调多个任务,提升吞吐量和响应速度。 |
典型问题 | 阻塞IO、非阻塞IO、IO多路复用、异步IO等。 | 多线程、事件驱动、Actor模型、协程(Coroutine)等。 |
2. 常见IO模型
IO模型的核心是如何处理IO操作的等待:
-
阻塞IO(Blocking IO)
-
线程发起IO操作后挂起,直到IO完成才继续执行。
-
优点:编程简单。
-
缺点:线程被阻塞,无法处理其他任务,资源利用率低。
-
典型应用:传统同步编程(如Java的
Socket
默认模式)。
-
-
非阻塞IO(Non-blocking IO)
-
线程发起IO操作后立即返回,通过轮询检查IO是否完成。
-
优点:避免线程阻塞。
-
缺点:轮询消耗CPU资源。
-
典型应用:需要低延迟的实时系统。
-
-
IO多路复用(IO Multiplexing)
-
通过单线程监控多个IO事件(如
select
/poll
/epoll
),当某个IO就绪时再处理。 -
优点:单线程处理多IO,减少线程切换开销。
-
缺点:编程复杂度较高。
-
典型应用:Nginx、Redis等高并发服务器。
-
-
异步IO(Asynchronous IO)
-
线程发起IO操作后立即返回,操作系统完成后通知线程(如回调函数)。
-
优点:完全非阻塞,资源利用率最高。
-
缺点:依赖操作系统支持,编程模型复杂。
-
典型应用:Windows的
IOCP
、Linux的io_uring
。
-
3. 常见并发模型
并发模型的核心是如何组织多个执行单元:
-
多线程/多进程模型
-
通过操作系统线程或进程实现并发,每个线程处理一个任务。
-
优点:充分利用多核CPU。
-
缺点:线程切换开销大,易出现竞态条件和死锁。
-
典型应用:Java的线程池、Python的
multiprocessing
。
-
-
事件驱动模型
-
单线程通过事件循环处理多个任务,依赖非阻塞IO和回调机制。
-
优点:轻量级,适合高并发IO密集型场景。
-
缺点:CPU密集型任务会阻塞事件循环。
-
典型应用:Node.js、Tornado。
-
-
协程(Coroutine)模型
-
通过用户级线程(协程)实现并发,协程由程序自身调度而非操作系统。
-
优点:极低的开销,适合高并发。
-
缺点:需要语言或框架支持(如Go的
goroutine
、Python的asyncio
)。 -
典型应用:Go语言、Python异步编程。
-
-
Actor模型
-
通过独立的Actor(轻量级进程)和消息传递实现并发,避免共享内存。
-
优点:天然避免竞态条件,易于分布式扩展。
-
缺点:消息传递可能引入延迟。
-
典型应用:Erlang、Akka框架。
-
4. IO模型与并发模型的关系
(1) 协作关系
-
IO模型决定如何高效处理单个IO操作,而并发模型决定如何组织多个任务。两者共同影响系统的吞吐量和响应速度。
-
示例:
-
事件驱动模型(并发) + IO多路复用(IO模型):
1.Node.js使用单线程事件循环(并发模型),结合epoll
(IO多路复用)实现高并发网络请求 ;2.Reactor模式:事件驱动模型 与 IO多路复用 的结合。 -
多线程模型(并发) + 阻塞IO(IO模型):
传统Java服务器为每个连接分配一个线程(并发模型),使用阻塞IO处理请求(IO模型),但线程切换开销大。 -
协程模型(并发) + 异步IO(IO模型):
Go语言的goroutine
(协程)结合异步IO(如netpoll
)实现高并发,协程在IO等待时自动挂起,不阻塞线程。
-
(2) 设计选择的影响
-
高并发IO密集型系统:通常选择非阻塞IO/异步IO + 事件驱动或协程模型,避免线程阻塞。
-
例如:Nginx(IO多路复用 + 事件驱动)、Go语言(异步IO + 协程)。
-
-
CPU密集型系统:可能选择多线程/多进程模型 + 同步IO,充分利用多核CPU。
-
例如:科学计算、图像处理。
-
(3) 性能优化的关键
-
减少IO等待时间:通过非阻塞IO或异步IO模型,避免线程/协程因IO操作挂起。
-
降低并发开销:通过轻量级并发模型(如协程、事件驱动)减少线程切换成本。
5. 典型组合示例
场景 | 并发模型 | IO模型 | 说明 |
---|---|---|---|
Web服务器 | 事件驱动(Node.js) | IO多路复用(epoll) | 单线程处理数千连接,适合高并发低延迟场景。 |
分布式微服务 | Actor模型(Akka) | 异步IO | Actor间通过消息通信,结合异步IO提升吞吐量。 |
实时数据处理 | 协程(Go goroutine) | 异步IO | 协程轻量级调度,异步IO避免阻塞,适合高吞吐量流处理。 |
传统企业应用 | 多线程(Java) | 阻塞IO | 简单易实现,但线程数受限,适合低并发场景。 |
6. 总结
-
IO模型:解决如何高效处理单个IO操作,目标是减少等待时间(如异步IO > IO多路复用 > 非阻塞IO > 阻塞IO)。
-
并发模型:解决如何组织多个任务,目标是提升吞吐量(如协程 > 事件驱动 > 多线程)。
-
两者的协作:
-
高性能系统通常结合非阻塞/异步IO模型与轻量级并发模型(如协程或事件驱动)。
-
设计决策需根据场景权衡:IO密集型系统优先优化IO模型,CPU密集型系统优先优化并发模型。
-
理解两者的关系,可以帮助开发者选择合适的技术组合,例如在Go语言中利用goroutine
(并发模型)和netpoll
(IO模型)实现高并发网络服务,或在Node.js中通过事件循环(并发模型)和epoll
(IO模型)构建高效的Web服务器。
三、并发处在哪个位置?架构模式 与 并发模型关系
篇一:
并发模型和软件架构模型是软件设计中两个不同层次的概念,它们的关注点、目标和应用范围有明显区别。以下是两者的主要差异:
维度 | 并发模型 | 软件架构模型 |
---|---|---|
范围 | 代码执行层面(微观) | 系统整体结构(宏观) |
抽象层级 | 中低层抽象(介于架构与实现之间)模块内部实现细节 | 高层抽象(系统级设计)系统级设计决策 |
关注点 | 任务并行性、资源竞争管理、线程/进程协作机制 | 系统整体结构、组件关系、通信流程 |
典型问题 | 线程安全、资源竞争、死锁 | 模块划分、组件通信、技术选型 |
典型目标 | 高吞度量、低延迟、资源高效利用 | 可维护性、扩展性、解耦 |
示例 | Reactor模式、Actor模型、CSP、多线程/协程 | 微服务、MVC、分层模式、六边形架构 |
1. 关注点不同
并发模型(Concurrency Model)
-
核心目标:解决程序如何高效处理多个任务的并行或并发执行。
-
关注点:
-
任务分解、资源分配(如线程、进程、协程)。
-
同步机制(如锁、信号量、消息传递)。
-
避免竞态条件、死锁等并发问题。
-
-
典型场景:多线程、事件驱动、Actor模型、CSP(Communicating Sequential Processes)等。
软件架构模型(Software Architecture Model)
-
核心目标:定义系统的整体结构,明确组件之间的关系和职责划分。
-
关注点:
-
模块化设计(如分层、微服务、单体架构)。
-
组件间通信(如API、消息队列、数据流)。
-
可扩展性、可维护性、容错性等非功能性需求。
-
-
典型场景:分层架构、微服务、事件驱动架构、MVC(Model-View-Controller)等。
2. 应用层次不同
并发模型 | 软件架构模型 |
---|---|
关注代码执行层面的并行逻辑,属于模块或组件内部的实现细节。 | 关注系统整体结构,属于全局设计决策。 |
例如:一个服务内部使用多线程处理请求。 | 例如:整个系统拆分为多个微服务,并通过消息队列通信。 |
3. 设计目标不同
并发模型 | 软件架构模型 |
---|---|
解决如何高效利用资源(如CPU、内存)和协调并发任务。 | 解决如何组织系统以满足业务需求和技术约束(如性能、可维护性)。 |
优化点:吞吐量、延迟、资源利用率。 | 优化点:模块解耦、系统扩展性、技术选型。 |
4. 典型示例对比
并发模型示例
-
多线程模型:通过线程池管理并发任务。
-
事件驱动模型:使用事件循环(如Node.js)处理异步I/O。
-
Actor模型:通过消息传递协调独立Actor(如Erlang、Akka)。
软件架构模型示例
-
分层架构:将系统分为展示层、业务逻辑层、数据访问层。
-
微服务架构:将系统拆分为独立部署的小型服务。
-
事件驱动架构:通过事件总线解耦组件(如Kafka驱动的系统)。
5. 关联性
-
两者可以结合使用:
例如,一个微服务架构(软件架构模型)中的某个服务,可能采用Actor模型(并发模型)实现内部并发逻辑。 -
软件架构可能约束并发模型的选择:
例如,单体架构可能更依赖多线程,而微服务架构可能更倾向于进程级隔离。
总结
维度 | 并发模型 | 软件架构模型 |
---|---|---|
范围 | 代码执行层面(微观) | 系统整体结构(宏观) |
目标 | 高效处理并行任务 | 组织系统以满足全局需求 |
典型问题 | 线程安全、资源竞争、死锁 | 模块划分、组件通信、技术选型 |
抽象层级 | 模块内部实现细节 | 系统级设计决策 |
通过理解两者的区别,可以更好地在系统设计中分层决策:架构模型决定“系统如何组织”,并发模型决定“代码如何并行执行”。
篇二、
1. 两者的定义和范畴不同
软件架构设计模式(Architectural Pattern)
-
定义:描述系统整体结构的组织方式,解决模块划分、组件交互、技术选型等宏观问题。
-
范畴:属于高层设计决策,例如:
-
分层架构(Presentation Layer, Business Layer, Data Layer)。
-
微服务架构(拆分为独立服务)。
-
事件驱动架构(通过事件总线解耦组件)。
-
并发模型(Concurrency Model)
-
定义:描述程序如何高效管理并行任务,解决资源竞争、同步、通信等底层问题。
-
范畴:属于实现层面的策略,例如:
-
多线程模型(通过锁或线程池管理共享资源)。
-
Actor模型(通过消息传递实现并发)。
-
事件循环模型(如Node.js的异步I/O)。
-
2. 关键区别
维度 | 软件架构设计模式 | 并发模型 |
---|---|---|
关注点 | 系统整体结构、组件关系、技术选型 | 任务并行化、资源竞争、同步机制 |
抽象层级 | 宏观设计(“系统如何组织?”) | 微观实现(“代码如何并发执行?”) |
典型问题 | 如何划分模块?服务如何通信? | 如何避免死锁?如何提升吞吐量? |
示例 | 微服务、MVC、六边形架构 | Actor模型、CSP、多线程/协程 |
3. 为什么并发模型不属于架构设计模式?
-
抽象层级不同
-
架构模式关注系统整体(如“是否拆分为微服务”),而并发模型关注代码执行细节(如“某个服务内部如何管理线程”)。
-
例如:微服务架构(架构模式)中的某个服务可能使用Actor模型(并发模型)处理内部并发逻辑。
-
-
解决的问题不同
-
架构模式解决的是系统复杂度和可维护性问题(例如分层解耦)。
-
并发模型解决的是资源利用率和性能问题(例如高并发场景下的吞吐量)。
-
-
设计决策的先后顺序
-
通常先选择架构模式(如微服务),再在具体模块中选择并发模型(如多线程或事件驱动)。
-
4. 两者的关联性
虽然并发模型不属于架构设计模式,但架构设计可能影响并发模型的选择:
-
单体架构:可能依赖多线程或协程实现并发。
-
微服务架构:每个服务内部可能采用不同的并发模型(如事件循环或Actor模型)。
-
事件驱动架构:可能结合消息队列(架构层)和异步处理(并发模型)。
5. 类比说明
-
架构模式类似“城市规划”:决定哪里建住宅区、商业区,道路如何连接。
-
并发模型类似“交通管理”:如何设计红绿灯、车道分配,避免堵车。
-
两者共同影响系统效率,但属于不同层面的问题。
总结
-
并发模型是“战术”:解决局部代码如何高效执行并发任务。
-
架构模式是“战略”:解决系统如何全局组织和扩展。
-
关系:架构模式为并发模型提供上下文,但两者独立存在。例如,一个微服务(架构模式)内部可能使用Actor模型(并发模型)处理请求。
四、IO模型、并发模型、架构模式三者关系
IO模型、并发模型、架构模式 是软件系统设计中不同层面的概念,分别解决不同维度的问题。它们的核心区别可以从目标、层级、关注点和实现方式等方面展开:
1. IO模型(I/O Model)
目标:解决程序如何高效处理输入/输出操作的问题,避免因等待I/O(如网络请求、磁盘读写)而浪费CPU资源。
层级:操作系统/网络通信层,与底层硬件和内核交互。
关注点:
-
如何管理I/O操作的阻塞与非阻塞行为。
-
如何通过事件通知(如
epoll
、kqueue
)或异步回调减少等待时间。
常见实现:
-
阻塞I/O:同步等待I/O完成(默认的
read()
/write()
)。 -
非阻塞I/O:轮询检查I/O是否就绪(
O_NONBLOCK
标志)。 -
I/O多路复用:单线程通过
select
/epoll
监控多个I/O事件(如Nginx)。 -
异步I/O(AIO):内核完成I/O后通知程序(如Linux的
io_uring
)。
示例:
一个聊天服务器使用epoll
监控数千个客户端连接,避免为每个连接创建独立线程。
注意:“网络连接”属于IO操作的一部分。在网络编程中,IO通常指的是输入输出,主要涉及到数据的读取和写入。网络连接的具体过程包括:建立连接、数据的读取和写入、错误处理等,这些操作都属于IO操作的范畴。
2. 并发模型(Concurrency Model)
目标:解决如何高效利用CPU资源并行处理多个任务的问题(如线程、协程、进程)。
层级:代码/进程级设计,关注任务调度和协作。
关注点:
-
任务间如何共享资源(锁、信号量)。
-
如何避免竞争、死锁和调度开销。
常见实现:
-
多线程/多进程:依赖操作系统调度(如Java线程池)。
-
事件循环(Event Loop):单线程异步调度任务(如Node.js、Redis)。
-
协程(Coroutine):用户态轻量级线程,手动切换(如Go的Goroutine)。
-
Actor模型:任务隔离,通过消息传递通信(如Erlang)。
示例:
一个Web服务器使用Go的Goroutine处理请求,每个请求由一个协程处理,协程由Go运行时调度。
3. 架构模式(Architectural Pattern)
目标:解决系统整体如何组织和分解的问题,提升可维护性、扩展性和可靠性。
层级:系统级设计,关注模块划分和通信方式。
关注点:
-
如何将系统拆分为独立的组件或服务。
-
组件间如何通信(如HTTP、消息队列)。
常见实现:
-
分层架构:按功能分层(如MVC分为模型、视图、控制器)。
-
微服务架构:拆分为独立部署的小服务(如Netflix)。
-
事件驱动架构:通过事件传递解耦组件(如Kafka流处理系统)。
-
CQRS(命令查询职责分离):读写操作分离到不同模型。
示例:
一个电商系统采用微服务架构,将订单、支付、库存拆分为独立服务,通过REST API和消息队列通信。
三者的核心区别
维度 | IO模型 | 并发模型 | 架构模式 |
---|---|---|---|
核心问题 | 如何高效处理I/O等待 | 如何高效并行处理任务 | 如何组织系统整体结构 |
层级 | 操作系统/网络通信层 | 代码/进程级 | 系统级设计 |
典型技术 | epoll 、异步I/O、NIO | 线程池、协程、Actor模型 | 微服务、事件驱动、CQRS |
目标 | 减少I/O阻塞,提升吞吐量 | 最大化CPU利用率 | 提升可维护性、扩展性 |
关联与协作
三者通常结合使用:
-
架构模式决定整体结构:
-
微服务架构中,每个服务可能采用事件循环+协程(并发模型)和异步I/O(IO模型)来提升性能。
-
-
并发模型依赖IO模型:
-
事件循环(并发模型)需要非阻塞I/O或I/O多路复用(IO模型)的支持。
-
-
架构模式可能隐含并发策略:
-
事件驱动架构(架构模式)通常结合异步I/O和单线程事件循环(并发模型)。
-
实际场景中的协同
假设设计一个高并发的API网关:
-
架构模式:选择微服务架构,将鉴权、限流、路由拆分为独立模块。
-
并发模型:使用协程(如Go的Goroutine)处理每个请求,避免线程切换开销。
-
IO模型:基于
epoll
(I/O多路复用)监听网络连接,异步处理HTTP请求。
三者共同作用,最终实现高吞吐、低延迟的系统。
相关文章:
IO模型之于并发编程模型、并发模型之于架构模式
一、并发编程模型主要包括以下几种: 多进程模型:利用操作系统的进程模型来实现并发。每个用户请求接入时都会创建一个进程,适用于I/O密集型任务。缺点是创建进程的开销高,且上下文切换的开销也大。典型应用如Apache Web Ser…...
Postman 7.3.5 旧版下载指南(Win64)及注意事项
Postman-win64-7.3.5-Setup 是 Postman 的一个旧版本(2019年发布,适用于 Windows 64位系统)。以下是相关信息和建议: 1. Postman 7.3.5 版本说明 功能:用于 API 开发、测试和协作。 系统要求:Windows 64位…...
Flink/Kafka在python中的用处
一、基础概念 1. Apache Kafka 是什么? 核心功能:Kafka 是一个分布式流处理平台,主要用于构建实时数据管道和流式应用程序。核心概念: 生产者(Producer):向 Kafka 发送数据的程序。…...
【Spring Boot 与 Spring Cloud 深度 Mape 之十】体系整合、部署运维与进阶展望
【Spring Boot 与 Spring Cloud 深度 Mape 之十】体系整合、部署运维与进阶展望 #微服务实战 #Docker #Kubernetes #SpringSecurity #OAuth2 #分布式事务 #Seata #ServiceMesh #总结 #SpringCloud #SpringBoot 系列终章:经过前九篇 [【深度 Mape 系列】] 的系统学习…...
轻松理解Python装饰器:从基础到应用
一、为什么需要装饰器 想象一下,你写了很多函数来完成不同的任务,突然有个新需求:在每个函数执行前打印一条“函数开始执行”的消息,执行后打印“函数执行结束”。如果没有装饰器,你就得在每个函数里手动添加这两条打…...
RabbitMQ 技术详解:异步消息通信的核心原理与实践
这里写目录标题 RabbitMQ 技术详解:异步消息通信的核心原理与实践一、RabbitMQ 本质剖析核心架构组件 二、核心功能与应用场景主要作用典型应用场景 三、工作流程深度解析消息传递流程关键协议机制 四、Java 实现示例1. 依赖配置(Maven)2. 消…...
MySQL-- 多表查询的分类,SQL92与SQL99,7种JOIN的实现,SQL99语法的新特性
目录 一,多表查询的分类 角度1:等值连接 vs 非等值连接 角度2:自连接 vs 非自连接 角度3:内连接 vs 外连接 二,SQL92语法实现内连接:见上,略SQL92语法实现外连接:使用 -…...
Selenium文件上传
在 Web 自动化测试中,文件上传是一项常见的任务。不同的网站和前端技术可能导致上传方式有所不同,因此需要采用不同的方法进行处理。 方法 1:使用 send_keys() 直接上传(最常用) 适用场景: 页面中 有标准的 <input type="file"> 标签。 不需要弹出 Wind…...
getID3获取本地或远程视频时长
音频文件也可使用,使用ffmeg安装太复杂了 附ffmpeg方式:centos下安装ffmpeg_yum安装ffmpeg-CSDN博客 使用composer先安装 composer require james-heinrich/getid3 获取本地视频 //获取本地视频$video_path $_SERVER[DOCUMENT_ROOT].$params[video];…...
OpenAI流式解析
OpenAI 流式的代码: 首选一般请使用os.getenv 去读环境变量的内容 注意使用pip install python-dotenv 的安装方法 load_dotenv 是这个库提供的一个函数,用于读取 .env 文件并将其中定义的键值对设置为系统的环境变量。 默认情况下,load_…...
在Trae中设置Python解释器版本
Python 是一种广泛使用的高级编程语言,因其简洁易读的语法和强大的功能而备受欢迎。随着 Python 的不断发展,多个版本相继发布,每个版本都带来了新特性和改进。然而,这也带来了一些问题,比如不同的工程,需要…...
第 6 章:优化动态分配内存的变量_《C++性能优化指南》_notes
优化动态分配内存的变量 第六章核心知识点详解总结第六章 动态内存优化 重点难点梳理 一、多选题(每题至少2个正确答案)二、设计题答案与详解多选题答案设计题答案示例 第六章核心知识点详解 动态内存分配的开销 知识点:动态内存分配需要调用…...
图像数据增强教程:为目标检测任务准备数据
目录 一、简介 二、代码结构 三、环境要求 四、数据增强类 4.1 调整增强概率和参数 4.2 增强方法参数 五、数据增强主函数 六、主函数 效果展示 完整代码 一、简介 在目标检测任务中,数据增强是一种关键技术,通过对原始图像应用多种变换来增加…...
Unity编辑器功能及拓展(2) —Gizmos编辑器绘制功能
Unity中的Gizmos功能是用于在场景视图中绘制辅助图形或图标的工具,帮助开发者在编辑模式下直观调试和可视化游戏对象的位置、范围、方向等信息。 一.定义概述 Gizomsd 概述 Gizoms是Unity提供的一个API,或者叫做一个工具类,包含一系列静态…...
HarmonyOS WebSocket全场景应用开发深度解析
注:适用版本(Harmony OS NEXT / 5.0 / API 12 ) 一、最终效果预览 二、基础代码结构 Entry Component struct ChatApp {State messages: Message[] [] // 所有聊天记录State inputText: string "" // 输入框内容State isCon…...
JCRQ1河马算法+消融实验!HO-CNN-LSTM-Attention系列四模型多变量时序预测
JCRQ1河马算法消融实验!HO-CNN-LSTM-Attention系列四模型多变量时序预测 目录 JCRQ1河马算法消融实验!HO-CNN-LSTM-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于HO-CNN-LSTM-Attention、CNN-LSTM-Attent…...
ubuntu 安装 postgresql
在 Ubuntu 系统中安装 PostgreSQL 的步骤如下: 步骤 1:更新软件包列表 sudo apt update步骤 2:安装 PostgreSQL Ubuntu 默认仓库包含 PostgreSQL,直接安装: sudo apt install postgresql postgresql-contrib -ypost…...
深入实践:基于WebSocket的全球化金融数据实时对接方案。 马来西亚、印度、美国金融数据API
深入实践:基于WebSocket的全球化金融数据实时对接方案 在全球金融市场中,实时数据的高效获取与处理是量化交易、行情监控等场景的核心能力。本文将以技术实践为核心,详细解析如何通过WebSocket技术实现美国、印度、马来西亚等多国金融数据&a…...
深度学习处理时间序列(5)
Keras中的循环层 上面的NumPy简单实现对应一个实际的Keras层—SimpleRNN层。不过,二者有一点小区别:SimpleRNN层能够像其他Keras层一样处理序列批量,而不是像NumPy示例中的那样只能处理单个序列。也就是说,它接收形状为(batch_si…...
Linux: 进程间通信
目录 一 前言 二 进程间通信目的 三 进程间通信方法 四 管道通信 1. 进程如何通信 2.管道概念 2.1匿名管道 2.2 匿名管道对多个进程的控制 2.3 命名管道 2.4 命名管道原理 一 前言 在我们学习进程的时候,我们知道正是因为程序地址空间的存在ÿ…...
为什么idea显示数据库连接成功,但操作数据库时,两边数据不同步
今日份小bug又叕又来了! 一、原因分析 1. 未提交的事务 - IDEA 中执行了修改操作但未提交事务 - 其他客户端有未提交的修改 2. 连接隔离级别问题 - 不同连接使用了不同的事务隔离级别 - 读未提交(READ UNCOMMITTED)导致看到未提交数据 3. 多客户端同时操作…...
VMware中新建Ubuntu虚拟机系统,并安装Anaconda
详细介绍 Ubuntu18.04版本的安装Anaconda的安装 Ubuntu20.04版本的安装给出其他参考 安装Ubuntu18.04 新建虚拟机 如果不习惯图文形式的,也可参考该up主的环境安装分享,和我如下记录有些不同,但不影响,大部分均一致。 …...
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板 一、揭开 LangChain 的 “灵魂引擎”:Prompt 的核心作用 在 LangChain 构建的智能应用中,Prompt(提示词)堪称驱动大模型的 “神经中枢”。这个承载着任务…...
项目如何安装本地tgz包并配置局部registry
一、判断包来源是否正确 1. 检查url curl <registry_url>2. 查看包是否存在 npm view <package_name> --registry<registry_url>二、局部registry配置步骤: 1. 全局配置 如果你希望对所有项目生效,可以将这行配置添加到全局.npmr…...
unity客户端面试高频2(自用)
标题是我 1.构造函数为什么不能为虚函数?析构函数为什么要虚函数?2.C智能指针3.左值和右值完美转发 4.深拷贝与浅拷贝5.malloc VS new 你们知道吗 1.构造函数为什么不能为虚函数?析构函数为什么要虚函数? 构造函数不能定义为虚函…...
【12】Ajax的原理和解析
一、前言 二、什么是Ajax 三、Ajax的基本原理 3.1 发送请求 3.2 解析内容 3.3 渲染网页 3.4 总结 四、Ajax 分析 五、过滤请求-筛选所有Ajax请求 一、前言 当我们在用 requests 抓取页面的时候,得到的结果可能会和在浏览器中看到的不一样&a…...
深度学习在测距模型中的应用
一、单目视觉测距和双目视觉测距简介 1、单目视觉测距 模型:深度估计(Depth Estimation) 原理:通过深度学习模型(如MonoDepth2、MiDaS)或传统的计算机视觉方法(如单目相机结合物体大小推断&am…...
Python np.vectorize函数介绍
np.vectorize 是 NumPy 提供的一个 用于将标量函数(scalar function)向量化 的工具,使其可以作用于 NumPy 数组,类似于 通用函数(ufunc) 的行为。 1️⃣ np.vectorize 语法 numpy.vectorize(pyfunc, otypes=None, signature=None, excluded=None, cache=False)📌 参数…...
HarmonyOS NEXT状态管理实践
在HarmonyOS NEXT开发中,状态管理是构建高效、响应式应用的核心。本文深入探讨状态管理的最佳实践,结合代码示例与案例分析,帮助开发者掌握这一关键技能。 一、状态管理装饰器的合理使用 HarmonyOS NEXT提供多种状态管理装饰器,…...
广告牌变“高空炸弹“?智能预警终端筑起安全防线!
近年来,随着城市发展步伐加快,广告牌已成为城市形象的重要载体。但与此同时,因设计缺陷、违规搭建、维护缺失等问题导致的广告牌坠落事故频发,给市民生命财产安全带来严重威胁。据不完全统计,我国2000万块户外广告牌中…...
scss预处理器对比css的优点以及基本的使用
本文主要在vue中演示,scss的基本使用。安装命令 npm install sass sass-loader --save-dev 变量 SCSS 支持变量,可将常用的值(如颜色、字体大小、间距等)定义为变量,方便重复使用和统一修改。 <template><…...
Redis 单线程
Redis 读写是否是单线程? 核心数据操作仍然是单线程 Redis 主要采用 单线程执行命令,这是因为: 避免加锁:如果多个线程并发修改数据,就需要加锁,而 Redis 采用单线程保证操作的原子性,无需加…...
Node.js 下载安装及环境配置教程、卸载删除环境配置超详细步骤(附图文讲解!) 从零基础入门到精通,看完这一篇就够了
Node.js 安装 一、进入官网地址下载安装包 Node.js — Download Node.js 选择对应你系统的Node.js版本,这里我选择的是Windows系统、64位 Tips:如果想下载指定版本,点击【以往的版本】,即可选择自己想要的版本下载 二、安装程序…...
第十五章:Python的Pandas库详解及常见用法
在数据分析领域,Python的Pandas库是一个不可或缺的工具。它提供了高效的数据结构和数据分析工具,使得数据处理变得简单而直观。本文将详细介绍Pandas库的基本功能、常见用法,并通过示例代码演示如何使用Pandas进行数据处理。最后,…...
Windows下VSCode的安装
前言 VSCode的安装看起来平平无奇,但也不是轻轻松松的。笔者将最新的Windows下安装VSCode,以及运行最简单的C程序的过程记录下来,供后续的自己和大家参考。 一、官网下载安装包 Visual Studio Code - Code Editing. Redefined 二、安装 直接…...
PgDog:一个PostgreSQL分布式集群中间件
PgDog 是一个实现了 PostgreSQL 分片、连接池以及负载均衡功能的中间。PgDog 使用 Rust 语言编写,支持跨平台(Linux、Mac OS、Windows),具有高性能和高可靠性,可以在不需要修改任何应用程序的前提下实现 PostgreSQL 数…...
基于yolov11的棉花品种分类检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面
【算法介绍】 基于YOLOv11的棉花品种分类检测系统是一种高效、准确的农作物品种识别工具。该系统利用YOLOv11深度学习模型,能够实现对棉花主要品种,包括树棉(G. arboreum)、海岛棉(G. barbadense)、草棉&a…...
Web网页内嵌福昕OFD版式办公套件实现在线预览编辑PDF、OFD文档
PDF,即Portable Document Format,用于以一种独立于应用程序、硬件、操作系统的方式共享和查看文档;OFD,即Office Open Document Format for Document,是一种在政府公文和法律文件等领域广泛应用的电子文件格式…...
UE4学习笔记 FPS游戏制作32 主菜单,暂停游戏,显示鼠标指针
文章目录 一主菜单搭建UI显示主菜单时,暂停游戏,显示鼠标绑定按钮 二 打开主菜单 一主菜单 搭建UI 添加一个MainUi的控件 添加一个返回游戏的按钮和一个退出游戏的按钮 修改一下样式,放中间 显示主菜单时,暂停游戏࿰…...
多线程 - 线程安全引入
写一个代码,让主线程创建一个新的线程,由新的线程负责完成一系列的运算(比如:1 2 3 ... 1000),再由主线程负责获取到最终结果。 但打印结果为 result 0,略微思考,明白了要让 t 线…...
Angular项目改端口号
在 Angular 项目中修改开发服务器的端口号(默认是 4200),可以通过以下几种方式实现: 方法 1:通过 ng serve 命令行参数 直接在运行 ng serve 时指定端口号: ng serve --port 4300效果:开发服务…...
论文内可解释性分析
目录 3 TEPM(Text-Enhanced Prototype Module)3.1 为什么要进行文本增强?(动机)3.2 为什么要使用 Concat(Fv, T) 和 Repeat(T) + Fv?3.3 为什么 Q=F_C,K=V=F_R ?(第一层注意力)3.4 为什么要进行两层注意力?3.5 为什么最终结果会更好?**3.6 面试官可能问的挑战性问题*…...
《C++11:通过thread类编写C++多线程程序》
关于多线程的概念与理解,可以先了解Linux下的底层线程。当对底层线程有了一定程度理解以后,再学习语言级别的多线程编程就轻而易举了。 【Linux】多线程 -> 从线程概念到线程控制 【Linux】多线程 -> 线程互斥与死锁 语言级别的…...
@Resource 与 @Autowired:Spring 中的依赖注入注解大比拼
在 Spring 框架中,依赖注入(DI)是核心功能之一,它允许开发者将组件之间的依赖关系交给 Spring 容器管理,从而实现解耦和更灵活的代码结构。Resource 和 Autowired 是两种常用的依赖注入注解,它们虽然功能相…...
大模型学习:从零到一实现一个BERT微调
目录 一、准备阶段 1.导入模块 2.指定使用的是GPU还是CPU 3.加载数据集 二、对数据添加词元和分词 1.根据BERT的预训练,我们要将一个句子的句头添加[CLS]句尾添加[SEP] 2.激活BERT词元分析器 3.填充句子为固定长度 代码解释: 三、数据处理 1.…...
Git和GitCode使用(从Git安装到上传项目一条龙)
第一步 菜鸟教程-Git教程 点击上方链接,完成Git的安装,并了解Git 工作流程,知道Git 工作区、暂存区和版本库的区别 第二步 GitCode官方帮助文档-SSH 公钥管理 点击上方链接,完成SSH公钥设置 第三步(GitCode的官方引…...
NodeJs之http模块
一、概念: 1、协议:双方必须共同遵从的一组约定。 Hypertext Transfer Protocol:HTTP,超文本传输协议 2、请求: ① 请求报文的组成: 请求行请求头空行请求体 ② 请求行: 请求方法URLHTTP版本…...
【深度学习与实战】2.3、线性回归模型与梯度下降法先导案例--最小二乘法(向量形式求解)
为了求解损失函数 对 的导数,并利用最小二乘法向量形式求解 的值 这是线性回归的平方误差损失函数,目标是最小化预测值 与真实值 之间的差距。 损失函数: 考虑多个样本的情况,损失函数为所有样本的平方误差之和&a…...
在word中使用zotero添加参考文献并附带超链接
一、引言 在写大论文时,为了避免文中引用与文末参考文献频繁对照、修改文中引用顺序/引用文献时手动维护参考文献耗易出错,拟在 word 中使用 zotero 插入参考文献,并为每个参考文献附加超链接,实现交互式阅读。 版本:…...
在Linux系统中将html保存为PNG图片
1 前言 之前使用Pyecharts库在Windows系统中生成图表并转换为PNG格式图片(传送门),现将代码放于Linux服务器上运行,结果发现错误,生成html文件之后无法保存图片。 2 原理 基于Selenium库的保存方案,其原…...