《Python Web网站部署应知应会》No4:基于Flask的调用AI大模型的高性能博客网站的设计思路和实战(上)
基于Flask的调用AI大模型的高性能博客网站的设计思路和实战(上)
摘要
本文详细探讨了一个基于Flask框架的高性能博客系统的设计与实现,该系统集成了本地AI大模型生成内容的功能。我们重点关注如何在高并发、高负载状态下保持系统的高性能和稳定性.用代码写一个网站现在越来越容易,但是要让网站在实际场景中保持稳定和高性能,尤其在大模型AI接口调用高并发背景下,真的需要一定的技术。文章详细介绍了多层次缓存策略、异步处理机制、请求批处理技术以及全面的性能监控系统的实现。通过多种性能测试工具的实战应用,包括负载测试、缓存性能测试和并发性能测试,我们不仅验证了系统的性能表现,还收集了关键数据指导持续优化。文章同时分享了在开发过程中遇到的各种挑战及解决方案,为类似系统的开发提供了实用的参考。
项目背景
随着内容创作需求的爆发性增长,AI辅助写作成为一种趋势。我们开发的这个Flask博客系统不仅支持传统的内容发布功能,还集成了本地部署的Ollama大模型,提供内容生成服务。然而,AI模型推理往往需要大量计算资源,容易成为系统的性能瓶颈,特别是在面对大量并发请求时。
系统的核心需求包括:
- 支持用户注册、登录、权限管理
- 博客内容的创建、编辑、发布和阅读
- 基于本地Ollama模型的AI内容生成(使用智谱 GLM4-9B模型)
- 在高并发(100+用户同时访问)情况下保持良好响应性
- 实时监控系统健康状态和性能指标
这些需求促使我们思考如何在Flask这样的轻量级框架上,构建一个能够支撑高并发访问、处理计算密集型任务的高性能系统。
网站截图
Flask博客网站核心文件结构说明
flask_blog/
│
├── app/ # 应用主目录
│ ├── __init__.py # 应用初始化,创建Flask实例和配置
│ ├── models.py # 数据库模型定义(用户、博客文章等)
│ ├── routes.py # 路由和视图函数定义
│ ├── forms.py # Web表单定义(登录、注册、发布博客等)
│ ├── ai_service.py # AI内容生成服务接口
│ ├── cache.py # 缓存管理实现
│ ├── auth.py # 用户认证和授权
│ ├── static/ # 静态文件目录
│ │ ├── css/ # CSS样式文件
│ │ │ └── style.css # 主样式表
│ │ ├── js/ # JavaScript文件
│ │ │ └── main.js # 主JS文件
│ │ └── images/ # 图片资源
│ └── templates/ # HTML模板
│ ├── base.html # 基础布局模板
│ ├── index.html # 首页模板
│ ├── login.html # 登录页面
│ ├── register.html # 注册页面
│ ├── post.html # 博客文章详情页
│ ├── create_post.html # 创建博客页面
│ └── profile.html # 用户资料页面
│
├── instance/ # 实例配置目录(包含本地配置和数据库)
│ └── blog.db # SQLite数据库文件
│
├── config.py # 应用配置类定义
├── reset_db.py # 数据库重置和初始化脚本
├── requirements.txt # 项目依赖包列表
└── README.md # 项目说明文档
文件/文件夹说明
核心应用文件
-
app/init.py: 应用工厂函数,创建和配置Flask应用实例,初始化扩展(如Flask-SQLAlchemy、Flask-Login)。主要功能包括数据库连接配置、登录管理器设置、蓝图注册等。
-
app/models.py: 定义数据库模型,包括User(用户)和Post(博客文章)等实体。User模型包含用户名、密码哈希、电子邮件等字段,Post模型包含标题、内容、创建时间和作者外键等字段。
-
app/routes.py: 定义所有路由和视图函数,处理Web请求。包括首页、登录、注册、博客详情、创建/编辑博客、用户个人资料等路由,以及AI内容生成接口。
-
app/forms.py: 使用Flask-WTF定义表单类,用于处理用户输入验证。包括登录表单、注册表单、博客发布表单以及AI内容生成表单等。
-
app/ai_service.py: 与Ollama模型交互,处理AI内容生成请求。封装了与本地AI模型通信的接口,处理请求参数和流式响应生成。
-
app/cache.py: 实现多层缓存策略,管理内存缓存和Redis缓存。定义缓存键生成、设置缓存内容和过期时间、获取缓存内容等功能,优化高频请求性能。
-
app/auth.py: 处理用户认证和授权,实现登录、注册和会话管理。包括密码哈希处理、用户验证、权限检查等功能。
静态文件和模板
-
app/static/css/style.css: 主要样式表,定义网站的视觉外观和布局。
-
app/static/js/main.js: 主要JavaScript文件,处理客户端交互和动态内容。
-
app/static/images/: 存放网站使用的图标、背景图和其他图像资源。
-
app/templates/base.html: 基础模板,定义网站的公共结构,包括导航栏、页脚等,其他模板继承自它。
-
app/templates/index.html: 首页模板,展示博客文章列表。
-
app/templates/login.html: 用户登录页面模板。
-
app/templates/register.html: 用户注册页面模板。
-
app/templates/post.html: 博客文章详情页模板,显示完整文章内容和评论。
-
app/templates/create_post.html: 创建和编辑博客文章的页面模板。
-
app/templates/profile.html: 用户个人资料页面模板,显示用户信息和发布的文章。
实例配置和数据
- instance/blog.db: SQLite数据库文件,存储所有应用数据,包括用户账户、博客文章和相关内容。
根目录文件
-
config.py: 应用配置类,定义开发、测试和生产环境的不同配置参数,如数据库URI、密钥等。
-
reset_db.py: 重置数据库并创建测试数据的脚本,方便开发和测试过程重新初始化环境。
-
requirements.txt: 项目Python依赖列表,包含所有必需的包及其版本,如Flask、Flask-SQLAlchemy、Flask-Login等。
-
README.md: 项目说明文档,包含安装步骤、使用方法、功能描述等信息。
文件结构采用了Flask官方推荐的应用工厂模式,将功能模块化组织,便于理解和维护。项目使用SQLite作为开发数据库,可以在不需要额外服务的情况下快速启动和测试应用。
核心概念和知识点
1. 高性能Web应用架构设计原则
在设计高性能Web应用时,我们遵循以下原则:
- 关注点分离:将不同功能模块解耦,使系统更易于扩展和维护
- 分层缓存:在多个层级实施缓存策略,减少重复计算和数据库访问
- 异步处理:将计算密集型任务异步化,避免阻塞主线程
- 批处理技术:合并同类请求,减少资源争用和上下文切换
- 实时监控:持续监测系统性能,及时发现并解决问题
2. Flask应用的性能优化技术
Flask作为一个轻量级框架,需要结合多种技术来提升其性能:
- 应用工厂模式:便于配置管理和测试
- 蓝图组织代码:模块化应用结构
- WSGI服务器:使用Gunicorn/uWSGI替代Flask内置服务器
- 数据库优化:合理设计索引、使用连接池
- 代码优化:减少不必要的计算和SQL查询
3. AI模型集成与性能优化
集成AI大模型时的主要挑战是处理其高计算需求:
- 流式响应:逐步返回AI生成内容,提升用户体验
- 推理优化:调整模型参数和批处理大小,平衡速度和质量
- 模型量化:降低模型精度以提高推理速度
- 计算资源管理:合理分配CPU/GPU资源
4. 高并发处理策略
处理高并发请求的核心策略:
- 连接池管理:有效复用数据库连接
- 请求限流:防止系统过载
- 队列机制:平滑处理请求峰值
- 负载均衡:分散请求到多个工作进程
技术实战和代码
1. 多层次缓存策略实现
我们实现了三层缓存策略,显著提升了系统响应速度:
# 内存缓存层
memory_cache = {}# Redis缓存层
def get_from_cache(key):# 先尝试从内存缓存获取if key in memory_cache:CACHE_HIT.inc() # Prometheus指标return memory_cache[key]# 再尝试从Redis缓存获取cached_data = redis_client.get(key)if cached_data:# 同时更新内存缓存memory_cache[key] = cached_dataCACHE_HIT.inc()return cached_dataCACHE_MISS.inc()return None# 数据库查询缓存装饰器
def cache_query(ttl=3600):def decorator(f):@wraps(f)def decorated_function(*args, **kwargs):# 生成缓存键key = f"query_{f.__name__}_{str(args)}_{str(kwargs)}"result = get_from_cache(key)if result is None:# 缓存未命中,执行查询start = time.time()result = f(*args, **kwargs)query_time = time.time() - startDB_QUERY_TIME.observe(query_time) # 记录查询时间# 存入缓存set_in_cache(key, result, ttl)return resultreturn decorated_functionreturn decorator
2. AI生成内容的流式响应实现
为提高用户体验,我们实现了AI内容的流式响应:
@app.route('/generate-blog', methods=['POST'])
def generate_blog():title = request.form.get('title')# 检查缓存cache_key = f"blog_gen_{title}"cached_result = get_from_cache(cache_key)if cached_result:return cached_result# 未命中缓存,调用AI模型def generate():start_time = time.time()INFERENCE_COUNT.inc() # 增加推理计数prompt = f"写一篇关于'{title}'的博客文章,包含引言、主体和总结。"# 流式生成内容for chunk in ollama_client.generate(prompt=prompt, model="llama2"):yield chunk# 记录生成时间generation_time = time.time() - start_timeAI_GENERATION_TIME.observe(generation_time)# 异步保存到缓存(完整内容需在流式传输后组装)# 此处使用线程避免阻塞响应threading.Thread(target=lambda: save_complete_content_to_cache(title, complete_content)).start()return Response(generate(), mimetype='text/plain')
3. 异步任务处理与请求批处理
对于计算密集型任务,我们使用异步队列和批处理技术:
# 使用Redis作为任务队列
task_queue = redis_client.StrictRedis(host='localhost', port=6379, db=1)# 提交生成任务
def submit_generation_task(title, callback_url):task_id = str(uuid.uuid4())task_data = {'task_id': task_id,'title': title,'callback_url': callback_url,'status': 'pending','timestamp': time.time()}task_queue.lpush('generation_tasks', json.dumps(task_data))return task_id# 批处理worker
def batch_processing_worker():while True:# 收集短时间内积累的任务tasks = []start_time = time.time()# 批量收集任务,最多等待100mswhile time.time() - start_time < 0.1 and len(tasks) < 10:task_data = task_queue.rpop('generation_tasks')if task_data:tasks.append(json.loads(task_data))else:time.sleep(0.01)if not tasks:time.sleep(0.1)continue# 批量处理任务batch_process_tasks(tasks)
4. 性能监控系统集成
我们使用Prometheus和Grafana构建了全面的监控系统:
from prometheus_client import Counter, Histogram, Gauge, Summary, start_http_server# 指标定义
REQUEST_COUNT = Counter("request_count", "Total number of requests", ["status"])
REQUEST_LATENCY = Histogram("request_latency_seconds", "Request latency in seconds")
INFERENCE_COUNT = Counter("inference_count", "Total number of AI inferences")
CACHE_HIT = Counter("cache_hit_count", "Cache hits")
CACHE_MISS = Counter("cache_miss_count", "Cache misses")
ACTIVE_USERS = Gauge("active_users", "Number of active users")
DB_QUERY_TIME = Summary("db_query_seconds", "Database query time")
BLOG_CREATE_COUNT = Counter("blog_create_count", "Blog creation count")
AI_GENERATION_TIME = Histogram("ai_generation_seconds", "AI content generation time",buckets=[0.1, 0.5, 1.0, 2.0, 5.0, 10.0, 30.0, 60.0])def init_metrics(app):@app.before_requestdef before_request():request.start_time = time.time()@app.after_requestdef after_request(response):process_time = time.time() - request.start_timestatus = "success" if response.status_code < 400 else "failure"REQUEST_COUNT.labels(status=status).inc()REQUEST_LATENCY.observe(process_time)return response# 启动指标服务器start_http_server(8001)
5. 并发性能测试工具
我们开发了专门的并发测试工具,评估系统在不同并发级别下的表现:
class ConcurrencyTester:"""并发性能测试工具"""def __init__(self, base_url="http://127.0.0.1:5000"):self.base_url = base_urlself.concurrency_levels = [1, 5, 10, 20, 50, 100]self.results = {}self.endpoints = [{"name": "首页", "url": "/", "method": "get", "data": None},{"name": "博客详情", "url": "/post/1", "method": "get", "data": None},{"name": "AI生成", "url": "/generate-blog", "method": "post", "data": lambda i: {"title": f"并发测试博客 {i}"}}]async def run_test(self, endpoint, concurrency):"""运行特定端点和并发级别的测试"""async with aiohttp.ClientSession() as session:tasks = []for i in range(concurrency):tasks.append(self.make_request(session, endpoint, i))durations = await asyncio.gather(*tasks)# 过滤出非None值durations = [d for d in durations if d is not None]return durationsasync def test_all_levels(self):"""测试所有端点在所有并发级别下的性能"""for endpoint in self.endpoints:endpoint_name = endpoint["name"]self.results[endpoint_name] = {}for level in self.concurrency_levels:durations = await self.run_test(endpoint, level)if durations:self.results[endpoint_name][level] = {"avg": np.mean(durations),"median": np.median(durations),"max": np.max(durations),"min": np.min(durations),"p95": np.percentile(durations, 95),"throughput": level / np.sum(durations),"error_rate": (level - len(durations)) / level}else:print(" 所有请求均失败")
疑难点与解决方案
1. AI模型推理延迟问题
问题:AI内容生成的平均响应时间达到3秒以上,严重影响用户体验。
解决方案:
- 实现流式响应,使用户能立即看到部分输出
- 调整模型参数,减少tokens生成总量
- 对常见主题预先生成内容并缓存
- 实现模型量化,用精度换取速度
优化后的代码:
def generate_blog_content(title):# 检查是否是热门主题,优先使用模板template = get_template_for_topic(extract_topic(title))if template:# 使用模板+少量自定义替换热门主题请求return customize_template(template, title)# 调整生成参数,限制tokensparams = {"model": "llama2-7b-chat-q4", # 量化版模型"prompt": f"写一篇关于'{title}'的简短博客...","max_tokens": 800, # 限制生成长度"temperature": 0.7 # 调整创造性}# 流式响应return stream_generate(params)
2. 缓存一致性问题
问题:多层缓存导致数据不一致,用户看到过期内容。
解决方案:
- 实现缓存失效传播机制
- 使用版本号标记缓存内容
- 为不同类型内容设置合理的TTL策略
缓存管理核心代码:
def invalidate_cache(key_pattern):"""使某一类缓存失效"""# 找到所有匹配的键matched_keys = redis_client.keys(key_pattern)# 清除Redis缓存if matched_keys:redis_client.delete(*matched_keys)# 清除内存缓存for k in list(memory_cache.keys()):if re.match(key_pattern, k):del memory_cache[k]# 发布缓存失效消息,通知其他服务器节点redis_client.publish('cache_invalidation', key_pattern)
3. 数据库连接池耗尽
问题:高并发下数据库连接池被耗尽,导致服务不可用。
解决方案:
- 优化连接池配置,增加最大连接数
- 减少长连接占用时间
- 实现连接租用超时和健康检查
- 增加慢查询监控
连接池优化代码:
# 数据库连接池配置
app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {'pool_size': 30, # 连接池大小'max_overflow': 15, # 最大允许溢出连接数'pool_timeout': 30, # 等待获取连接的超时时间'pool_recycle': 1800, # 连接回收时间'pool_pre_ping': True # 使用前ping测试连接健康
}# 监控数据库连接使用情况
@app.after_request
def track_db_connections(response):conn_info = db.engine.pool.status()POOL_USED_CONNECTIONS.set(conn_info['used'])POOL_AVAILABLE_CONNECTIONS.set(conn_info['available'])return response
4. 内存泄漏问题
问题:长时间运行后,内存占用持续增加,最终导致OOM。
解决方案:
- 使用内存分析工具(如memory-profiler)找出泄漏点
- 优化内存缓存管理,实现LRU淘汰策略
- 定期清理不使用的资源
- 增加内存使用监控
内存管理代码:
class LRUCache:"""有大小限制的LRU缓存实现"""def __init__(self, capacity=1000):self.cache = OrderedDict()self.capacity = capacitydef get(self, key):if key not in self.cache:return None# 将访问的元素移至末尾,表示最近使用self.cache.move_to_end(key)return self.cache[key]def put(self, key, value):if key in self.cache:# 更新现有键值self.cache.move_to_end(key)elif len(self.cache) >= self.capacity:# 移除最不常用的元素self.cache.popitem(last=False)self.cache[key] = value# 替换全局内存缓存
memory_cache = LRUCache(capacity=10000)# 定期清理任务
def cleanup_resources():while True:try:gc.collect() # 触发垃圾回收# 记录当前内存使用情况MEMORY_USAGE.set(get_process_memory_info())time.sleep(300) # 每5分钟执行一次except Exception as e:print(f"清理任务出错: {e}")
性能优化成果
通过综合应用上述技术和策略,我们在系统性能上取得了显著成果:
-
响应时间:
- 普通页面请求从平均250ms降至50ms
- AI生成内容从3.5秒降至平均1.2秒(感知延迟降至0.3秒)
-
吞吐量:
- 系统每秒峰值请求处理能力从50提升至280
- AI生成接口并发处理能力从10提升至50
-
缓存效率:
- 缓存命中率从最初的40%提升至85%
- 数据库查询减少了65%
-
系统稳定性:
- 能够稳定处理100+用户的持续访问
- 错误率从峰值5%降至0.2%以下
- 内存使用趋于稳定,不再出现泄漏问题
总结和扩展思考
通过这个项目,我们成功构建了一个既具备传统内容管理功能,又能提供AI生成服务的高性能博客系统。这种结合传统Web应用和AI技术的系统代表了当前应用开发的一个重要趋势。
关键经验总结
- 分层设计的重要性:清晰的层次结构让优化工作更有针对性
- 监控先行:完善的监控系统是发现问题和评估优化效果的基础
- 多层缓存的效果显著:不同层次的缓存共同作用,极大提升了系统性能
- 用户体验优先:流式响应虽然没有减少总处理时间,但大幅提升了用户体验
- 性能测试的系统化:建立全面的测试体系,能持续指导优化方向
未来扩展方向
-
微服务化:将AI处理拆分为独立服务,实现更好的扩展性
+--------------+ +------------------+ +-------------+ | Flask Web | <--> | API Gateway | <--> | AI Service | | Application | | Load Balancer | | (Scalable) | +--------------+ +------------------+ +-------------+
-
混合部署模式:根据需求灵活选择本地或云端AI模型
def select_ai_model(request_params):"""根据请求复杂度选择本地或云端模型"""if is_complex_request(request_params):return cloud_ai_clientreturn local_ai_client
-
个性化缓存策略:基于用户行为分析的智能缓存预热
def preload_cache_for_trending_topics():"""预先生成热门话题的内容并缓存"""trending_topics = analyze_trending_topics()for topic in trending_topics:submit_generation_task(topic, cache_only=True)
-
边缘计算:将部分计算和缓存下沉到更接近用户的节点
+-------------+ +---------------+ +--------------+ | User Device | --> | Edge Node | --> | Central | | (Browser) | | (Cache+Basic | | Application | +-------------+ | Processing) | +--------------++---------------+
适用场景与价值
这种高性能博客系统架构特别适用于以下场景:
- 内容创作平台:需要AI辅助内容生成的创作系统
- 教育平台:需要生成教学内容和示例的教育网站
- 企业知识库:需要智能搜索和内容推荐的知识管理系统
- 媒体网站:需要快速内容生成和发布的新闻媒体平台
最后,高性能Web应用的开发是一个持续迭代的过程。通过科学的测量、分析和优化循环,我们能够不断提升系统性能,为用户提供更好的体验。本项目中使用的技术和方法,可以作为其他融合AI功能的Web应用的参考模型。
相关文章:
《Python Web网站部署应知应会》No4:基于Flask的调用AI大模型的高性能博客网站的设计思路和实战(上)
基于Flask的调用AI大模型的高性能博客网站的设计思路和实战(上) 摘要 本文详细探讨了一个基于Flask框架的高性能博客系统的设计与实现,该系统集成了本地AI大模型生成内容的功能。我们重点关注如何在高并发、高负载状态下保持系统的高性能和…...
vulnhub-Node1
一、信息收集 1、扫靶机ip arp-scan -l 2、端口扫描 淦,只有22端口和3000端口,访问一下3000端口吧,估计是个网页 nmap -p- -Pn -sC -sV -n 192.168.66.130PORT STATE SERVICE VERSION 22/tcp open ssh OpenSS…...
什么是 OLAP 数据库?企业如何选择适合自己的分析工具
引言:为什么企业需要 OLAP 数据库? 你是否曾经经历过这样的场景: 市场部门急需一份用户行为分析报告,数据团队告诉你:“数据太大了,报表要跑 4 个小时”;业务负责人在会议中提出一个临时性分析…...
计算机视觉准备八股中
一边记录一边看,这段实习跑路之前运行完3DGAN,弄完润了,现在开始记忆八股 1.CLIP模型的主要创新点: 图像和文本两种不同模态数据之间的深度融合、对比学习、自监督学习 2.等效步长是每一步操作步长的乘积 3.卷积层计算输入输出…...
电源系统的热设计与热管理--以反激式充电器为例
前言 反激电源常用于各种电子设备中,比如充电器、适配器等,它们通过变压器进行能量转换。高温环境可能对电子元件造成影响,特别是像MOSFET、二极管、变压器这样的关键部件,导致效率变低,甚至可能导致功能失效。还有安…...
【云服务器】在Linux CentOS 7上快速搭建我的世界 Minecraft 服务器搭建,并实现远程联机,详细教程
【云服务器】在Linux CentOS 7上快速搭建我的世界 Minecraft 服务器搭建,详细详细教程 一、 服务器介绍二、下载 Minecraft 服务端三、安装 JDK 21四、搭建服务器五、本地测试连接六、添加服务,并设置开机自启动 前言: 推荐使用云服务器部署&…...
vue数据两个相同的参数对比只显示一个
vue数据两个相同的参数对比只显示第一个 如每条的rq0/rq1对比data() { return{dataList: [{CurrencyName: "现金",rq0: "2017-10-20 19:22:17",rq1: "2018-02-07 19:48:00",yje: -1179.8},{CurrencyName: "微支付",rq0: "2017-10…...
vue如何实现前端控制动态路由
在 Vue.js 中,动态路由是一种根据不同用户权限或其他因素动态改变路由列表的功能。这种机制允许开发者根据后端提供的权限数据动态渲染前端路由,实现多用户权限系统,不同用户展示不同的导航菜单。 动态路由的配置 动态路由的配置涉及到前端…...
开发环境部署
一、安装Django-5.0.3 1、将已下载的软件通过winscp上传至centos下 2、 安装 [root@hcss-ecs-1e19 ~]# ll total 10372 -rw-r--r-- 1 root root 10620661 Feb 10 10:16 Django-5.0.3.tar.gz [root@hcss-ecs-1e19 ~]# pip3 install Django-5.0.3.tar.gz Processing ./Django-…...
C语言入门教程100讲(0)从了解C语言的发展史开始
文章目录 引言1. C语言的起源2. C语言的诞生3. C语言的标准化4. C语言的进一步发展5. C语言的影响与应用6. C语言的未来结语引言 C语言作为一种高效、灵活且具有广泛应用的编程语言,在计算机科学史上占据着举足轻重的地位。它的设计不仅影响了后来的编程语言,也对操作系统、…...
笔记本电脑更换主板后出现2203:System configuration is invalid,以及2201、2202系统错误的解决
笔记本电脑更换主板后启动出现2203:System configuration is invalid,以及2201、2202系统错误的解决 自用的一台ThinkpadT490笔记本电脑 ,由于主板故障,不得不更换主板,通过某宝购置主板后进行了更换。 具体拆卸笔记本可搜索网络视频教程。 注意: 在更换主板时,注意先拍…...
如何为 Debian 和 Kali 系统更换软件源并更新系统
在 Linux 系统中,软件源(Software Repository)是获取软件包和更新的核心途径。然而,默认的软件源可能会因为地理位置、网络状况等原因导致下载速度缓慢,甚至无法访问。为了提升系统的软件获取效率,许多用户…...
git:远程仓库拉取到本地,fork到本地,修改后再上传
讲述仓库成员拉取远程仓库(即组长的仓库,里面有成员)到本地,修改内容再上传的详细步骤: 1.进入仓库,首先fork (如不,所作操作会直接对远程仓库进行,不用管理员审核&…...
C++ 中名字的作用域、概念、嵌套与实践(十八)
1. 名字的作用域基本概念 作用域(scope) 指的是程序中的一个区域(通常被花括号 {} 包围),在这里一个名字(如变量名、函数名、类名等)有其特定含义。 在 同一个作用域 中,一个名字只…...
Go语言nil原理深度解析:底层实现与比较规则
Go语言nil原理深度解析:底层实现与比较规则 引言 在Go语言中,nil 是一个特殊的关键字,用于表示引用类型的“零值”。它在指针、切片、映射、通道、接口和函数等类型中广泛使用。本文将从 底层实现、比较规则、与其他语言的对比 等角度&#…...
使用Java操作Redis
文章目录 常用Redis键操作命令使用Java操作Redis配置 Redis 连接信息创建 Maven 项目结构 操作字符串操作列表操作集合操作散列操作有序集合总结 报错解决办法: 当使用redis-cli连接客户端出现not connected时 使用redis-cli -h 192.168.222.101 -p 6379即可解决 …...
开源的CMS建站系统可以随便用吗?有什么需要注意的?
开源CMS建站系统虽然具有许多优点,但并非完全“随便用”。无论选哪个CMS系统,大家在使用的时候,可以尽可能地多注意以下几点: 1、版权问题 了解开源许可证:不同的开源CMS系统采用不同的开源许可证,如GPL、…...
数据结构:探秘AVL树
本节重点 理解AVL树的概念掌握AVL树正确的插入方法利用_parent指针正确更新平衡因子掌握并理解四种旋转方式:左单旋,右单旋,左右双旋,右左双旋 一、AVL树的概念 AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis&…...
C++ 变量与初始化详解(十五)
1. 变量定义 在 C 中,定义变量的基本形式通常是先写出 类型说明符(type specifier),后面紧跟由逗号分隔的一个或多个变量名,最后以分号结束。简单示例如下: int sum 0, value, units_sold 0; Sales_ite…...
【网络协议详解】—— STP 、RSTP、MSTP技术(学习笔记)
一、STP技术工作原理 STP(Spanning Tree Protocol)生成树协议(IEEE 802.1D)是一种网络协议,用于在网络拓扑中防止环路的产生。在二层交换网络中,逻辑上阻塞部分接口,实现从根交换机到所有节点的…...
C++中将记录集的数据复制到Excel工作表中的CRange类CopyFromRecordset函数异常怎么捕获
文章目录 一、异常类型及捕获逻辑二、完整代码示例三、关键错误场景与解决方案1. CopyFromRecordset 返回空数据2. COM错误 0x800A03EC3. Excel进程残留4. 内存不足 四、调试与日志记录1. 启用详细日志2. 捕获错误描述3. 调试断点 五、最佳实践 在C中使用 CRange::CopyFromReco…...
综述速读|086.04.24.Retrieval-Augmented Generation for AI-Generated Content A Survey
论文题目:Retrieval-Augmented Generation for AI-Generated Content: A Survey 论文地址:https://arxiv.org/abs/2402.19473 bib引用: misc{zhao2024retrievalaugmentedgenerationaigeneratedcontent,title{Retrieval-Augmented Generation…...
对内核fork进程中写时复制的理解记录
前言 文章写于学习Redis时对aof后台重写中写时复制的疑问 一、感到不理解的歧义 在部分技术文档中(以小林的文章为例),对写时复制后的内存权限存在如歧义: ! 二、正确技术表述 根据Linux内核实现(5.15版本&#x…...
【新手初学】SQL注入getshell
一、引入 木马介绍: 木马其实就是一段程序,这个程序运行到目标主机上时,主要可以对目标进行远程控制、盗取信息等功能,一般不会破坏目标主机,当然,这也看黑客是否想要搞破坏。 木马类型: 按照功…...
【湖北工业大学2025年ACM校赛(同步赛)】题解
比赛链接 A. 蚂蚁上树 题目大意 给定一棵 n n n 个结点的树,根结点为 1 1 1。每个 叶结点 都有一只蚂蚁,每过 1 1 1 秒钟,你可以选一些蚂蚁往其 父结点 走一步,但是要求任意两只蚂蚁都不能在同一个 非根结点 上。 问至少要…...
FPGA Verilog/VHDl 中的锁存latch
目录 一、前言二、锁存器定义三、verilog中锁存的产生四、verilog中锁存的影响和消除五、FPGA中的锁存器资源 一、前言 在做FPGA设计时,我们要求在组合逻辑设计时,case或者if-else条件要完整,否则会产生锁存。本文主要介绍锁存产生的原因和影…...
Ubuntu24.04 配置远程桌面服务
一:安装 sudo apt update sudo apt install vino 二:设置 gsettings set org.gnome.Vino require-encryption false # 关闭加密(某些 VNC 客户端不支持加密) gsettings set org.gnome.Vino prompt-enabled false # 关闭连接…...
【二刷代码随想录】螺旋矩阵求解方法、推荐习题
一、求解方法 (1)按点模拟路径 在原有坐标的基准上,叠加 横纵坐标 的变化值,求出下一位置,并按题完成要求。但需注意转角的时机判断,特别是最后即将返回上一出发点的位置。 (2)按层…...
Python基础教程:从格式化到项目管理
一、Typora代码块支持格式 在Typora中编写代码时,支持多种语言的语法高亮显示: 二、代码格式化 1. %格式化(传统方式) 第一种方式:正规方式 示例代码: name "张三" age 10 print("我的…...
Python爬虫:开启数据抓取的奇幻之旅(一)
目录 一、爬虫初印象:揭开神秘面纱 二、工欲善其事:前期准备 (一)Python 环境搭建 1.下载 Python 安装包: 2.运行安装程序: 3.配置环境变量(若自动添加失败)&#x…...
分布式ID服务实现全面解析
分布式ID生成器是分布式系统中的关键基础设施,用于在分布式环境下生成全局唯一的标识符。以下是各种实现方案的深度解析和最佳实践。 一、核心需求与设计考量 1. 核心需求矩阵 需求 重要性 实现难点 全局唯一 必须保证 时钟回拨/节点冲突 高性能 高并发场景…...
浏览器与网络模块实践
浏览器渲染步骤 浏览器渲染大致分为以下四个步骤: 1. 构建 DOM 树 • 过程:当浏览器接收到 HTML 文档后,会从上到下依次解析 HTML 代码。每遇到一个开始标签,就会创建一个对应的 DOM 节点,并根据标签的嵌套关系将这些…...
谈谈Minor GC、Major GC和Full GC
目录 一、背景 二、三者之间的区分 1、Minor GC 2、Major GC (1)老年代空间不足: (2)晋升(Promotion)失败: (3)空间分配担保失败: &#x…...
基于SpringBoot实现的高校实验室管理平台功能四
一、前言介绍: 1.1 项目摘要 随着信息技术的飞速发展,高校实验室的管理逐渐趋向于信息化、智能化。传统的实验室管理方式存在效率低下、资源浪费等问题,因此,利用现代技术手段对实验室进行高效管理显得尤为重要。 高校实验室作为…...
梯度裁剪(Gradient Clipping)
梯度裁剪(Gradient Clipping)是一种用于防止梯度爆炸(Gradient Explosion)的技术,具体来说: 1. 梯度裁剪的作用 问题背景:在训练深度神经网络(尤其是RNN/LSTM)时&#x…...
联合办公空间WeWork的创新模式与私域流量时代的品牌温度——兼论开源AI大模型AI智能名片S2B2C商城小程序源码的潜在价值
摘要:本文聚焦于联合办公空间WeWork的成功模式,深入剖析其如何让创业用户摆脱传统租赁的束缚,打破空间与社交限制,为创业带来新的可能性与趣味性,并有效降低创业成本与风险。同时探讨了WeWork在私域流量时代所建立的平…...
Git配置
为什么要用:下载zip只是当前分支,不能进行仓库push、pull、checkout 1. 下载Git 先判断是否已经下过Git: git --version若没有版本号出来,就去下载:https://git-scm.com/downloads (Windows、linux、mac…...
Protobuf 的快速使用(二)
这个部分会对通讯录进⾏多次升级,使⽤ 2.x 表⽰升级的版本,最终将会升级如下内容: 不再打印联系⼈的序列化结果,⽽是将通讯录序列化后并写⼊⽂件中。 从⽂件中将通讯录解析出来,并进⾏打印。 新增联系⼈属性ÿ…...
网页设计思路
CSS实现思路: 用一个div直接父级继承 在这里插入图片描述 一LOGO结构 h1>a>搜索关键字 二导航栏结构 结构:ul>li>a 三搜索框结构 div>input/a 四用户头像结构 div>a>imgspan 处理行内块和行内垂直对齐方向使用 vertical-align...
Vue3 配合 fullPage.js 打造高效全屏滚动网页
引言 在现代网页设计中,整屏滚动(Full-page Scrolling)已成为展示内容的一种流行方式。通过将内容分成若干个全屏页面,并配合流畅的过渡动画,可以为用户带来身临其境的浏览体验。本文将介绍如何使用 fullPage.js 插件来…...
全排列 II:去重的技巧与实现
全排列 II:去重的技巧与实现 1. 引言:排列问题的坑 你有没有遇到过这样的问题? 当我们在做全排列(Permutation)的时候,如果输入的数组中包含重复元素,生成的排列中就会出现大量重复项。这样不…...
微型导轨和普通导轨有哪些区别?
微型导轨和普通导轨都是常用的工业机械传动装置,目前,市场上有各种各样的导轨产品。那么微型导轨和普通导轨有哪些区别呢? 1、尺寸:微型导轨尺寸较小,滑座宽度最小可达 8MM,长度最小可达 11MM 左右…...
Java 输入流到输出流
Java 输入流到输出流的复制方法主要有以下六种实现方式,根据性能、适用场景和实现原理可分为不同类别: 一、基础字节流方式 实现原理:通过 FileInputStream 和 FileOutputStream 逐字节或块读取数据并写入。 代码示例: try (In…...
Anaconda安装-Ubuntu-Linux
1、进入Anaconda官网,以下载最新版本,根据自己的操作系统选择适配的版本。 2、跳过注册: 3、选择适配的版本: 4、cd ~/anaconda_download 5、bash Anaconda3-2024.10-1-Linux-x86_64.sh 6、按Enter或PgDn键滚动查看协议&…...
每日一题之既约分数
题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 如果一个分数的分子和分母的最大公约数是 1,这个分数称为既约分数。 例如 3/4,1/8,7/1, 都是既约分数。 请问,有多少个既约分…...
诠视科技MR眼镜如何使用VLC 进行RTSP投屏到电脑
文章目录 一、应用开发部分(1)基础场景构建(2)添加XvCameraManager(3)添加XvMRVideoCaptureManager(4)添加XvRTSPStreamerManager(5)打包测试 二、VLC media …...
“头”里有什么——HTML 元信息
2025/3/28 向全栈工程师迈进! 一、看基本HTML <!doctype html> <html lang"zh-CN"><head><meta charset"utf-8" /><title>我的测试页面</title></head><body><p>这是我的页面</p&g…...
【Kafka】从理论到实践的深度解析
在当今数字化转型的时代,企业面临着数据量呈指数级增长、业务系统愈发复杂的挑战。在这样的背景下,高效的数据传输与处理技术成为了关键。Kafka,作为一款分布式消息队列系统,凭借其卓越的性能和丰富的特性,在众多企业的…...
Debezium系列之:使用Debezium和Apache Iceberg构建数据湖
Debezium系列之:使用Debezium和Apache Iceberg构建数据湖 Debezium Server Iceberg“Debezium Server Iceberg” 消费者设置数据复制Upsert 模式保留已删除的记录使用Upsert模式追加模式优化批处理大小在数据分析的世界中,数据湖是存储和管理大量数据以满足数据分析、报告或机…...
resnet网络迁移到昇腾执行(OM上篇)
目录 总体介绍 pytorch迁移OM模型 原始代码详细介绍 模型加载和初始化 初始化统计变量 数据推理及归一化 统计每个样本的结果 基本概念 Softmax(归一化指数函数) 作用 代码示例 应用场景 argmax取最大值索引 作用 代码示例 两者配合使用…...