构建高并发Web服务:Gunicorn与Flask在Docker中的完美融合

1. 引言

在数字化时代,Web服务的性能和可靠性对于任何在线业务的成功至关重要。随着用户基数的增长和业务需求的扩展,高并发处理能力成为了衡量一个Web服务质量的关键指标。高并发Web服务不仅能够确保用户体验的流畅性,还能在流量激增时保持系统的稳定运行,从而避免潜在的收入损失和品牌信誉的损害。

1.1 高并发Web服务的重要性

高并发Web服务的重要性体现在以下几个方面:

  • 用户体验:快速响应的Web服务能够提供更加流畅的用户体验,减少用户等待时间,从而提高用户满意度和留存率。
  • 系统稳定性:在高流量情况下,高并发处理能力可以防止系统崩溃,确保服务的连续性和可靠性。
  • 可扩展性:随着业务的发展,高并发Web服务架构可以更容易地进行水平扩展,以适应不断增长的访问需求。
  • 成本效益:通过优化资源使用,高并发Web服务可以在不增加额外成本的情况下处理更多的请求,提高服务器的利用率。

1.2 Gunicorn、Flask与Docker简介

Gunicorn:Gunicorn(Green Unicorn)是一个用于UNIX的WSGI(Web Server Gateway Interface)HTTP服务器,它以轻量级和高性能著称,适合部署Python
Web应用程序。Gunicorn通过多进程的方式处理请求,可以有效地利用多核CPU,提供稳定的服务。

  • Flask:Flask是一个使用Python编写的轻量级Web应用框架。它简单易用,灵活性高,适合快速开发小型到中型的Web应用。Flask的核心设计理念是保持框架的简洁性,同时允许开发者根据需要添加扩展。

  • Docker:Docker是一个开源的容器化平台,它允许开发者将应用及其依赖打包到一个轻量级、可移植的容器中。Docker容器可以在任何支持Docker的环境中运行,确保应用在不同环境中的一致性。Docker的容器化技术简化了部署流程,提高了开发和运维的效率。

结合Gunicorn、Flask和Docker,开发者可以构建一个既高效又易于管理的Web服务架构。Gunicorn作为Flask应用的前端服务器,处理并发请求;Flask提供Web应用的逻辑实现;Docker则确保应用在不同环境中的无缝部署和运行。这种组合不仅提升了Web服务的性能,还简化了开发和部署的复杂性,是构建高并发Web服务的理想选择。

2. Gunicorn与Flask的基础知识

在深入探讨如何使用Gunicorn、Flask和Docker构建高并发Web服务之前,了解这些技术的基础知识是至关重要的。

2.1 Flask框架概述

在这里插入图片描述

Flask是一个微型Web框架,它基于Werkzeug工具箱和Jinja2模板引擎。Flask的设计哲学是保持核心简单但可扩展,这使得它非常适合小型项目和初创公司。Flask不强制使用特定的项目结构或数据库,开发者可以根据项目需求自由选择组件。

Flask的核心特性包括:

  • 路由系统:Flask使用装饰器来定义URL路由,使得代码简洁且易于理解。
  • 请求和响应处理:Flask提供了简单的方式来处理HTTP请求和生成响应。
  • 模板渲染:Flask内置了Jinja2模板引擎,可以方便地渲染HTML模板。
  • 扩展支持:Flask有丰富的扩展生态系统,可以轻松添加数据库集成、表单验证、用户认证等功能。

2.2 Gunicorn作为WSGI服务器

在这里插入图片描述

Gunicorn是一个Python WSGI HTTP服务器,它为UNIX系统设计,以性能和并发处理能力著称。Gunicorn可以作为Flask应用的生产服务器,提供比Flask内置的开发服务器更稳定和高效的运行环境。

Gunicorn的主要特点包括:

  • 多进程模型:Gunicorn默认使用多进程模型来处理请求,可以充分利用多核CPU。
  • 预先创建进程:Gunicorn在启动时预先创建一定数量的工作进程,以减少请求处理时的延迟。
  • 支持多种工作模式:除了多进程模式,Gunicorn还支持异步工作模式,如gevent和eventlet,以处理高并发的I/O密集型应用。
  • 简单配置:Gunicorn的配置简单直观,可以通过命令行参数或配置文件进行设置。

2.3 Flask与Gunicorn的结合

将Flask应用部署到Gunicorn服务器上,可以显著提高应用的性能和稳定性。以下是结合Flask和Gunicorn的基本步骤:

  • 安装Gunicorn:首先,需要通过pip安装Gunicorn。

    pip install gunicorn
    
  • 启动Gunicorn:使用Gunicorn启动Flask应用,可以通过命令行指定Flask应用的入口点。

    gunicorn -w 4 -b 0.0.0.0:8000 your_flask_app:app
    

    在这个命令中,-w选项指定工作进程的数量,-b选项指定绑定的地址和端口,your_flask_app是包含Flask应用实例的模块名,app是Flask应用实例的名称。

  • 配置Gunicorn:为了更好地控制Gunicorn的行为,可以创建一个配置文件,并在启动Gunicorn时指定该文件。

    # gunicorn_config.py
    workers = 4
    bind = '0.0.0.0:8000'
    

    然后使用以下命令启动Gunicorn:

    gunicorn -c gunicorn_config.py your_flask_app:app
    

通过以上步骤,Flask应用就可以在Gunicorn服务器上运行,提供更高效和稳定的服务。

3. Docker容器化技术

Docker已经成为现代软件开发和部署的标准工具之一。它通过容器化技术,提供了一种轻量级、可移植且自包含的方式来打包和运行应用程序。

3.1 Docker简介

在这里插入图片描述

Docker是一个开源的平台,允许开发者自动化应用程序的部署、扩展和管理。Docker利用容器化技术,将应用程序及其依赖打包到一个容器中,这个容器可以在任何支持Docker的环境中运行,确保应用在不同环境中的一致性。

Docker的核心优势包括:

  • 隔离性:Docker容器提供了进程、网络和文件系统的隔离,确保应用运行在一个独立的环境中。
  • 可移植性:Docker容器可以在任何安装了Docker的机器上运行,无论是开发者的笔记本、数据中心的物理机还是云服务器。
  • 轻量级:Docker容器共享主机系统的内核,不需要额外的虚拟化管理程序,因此启动速度快,资源消耗低。
  • 版本控制:Docker镜像可以进行版本控制,方便回滚和追踪变更。

3.2 Docker的基本概念与术语

镜像(Image):Docker镜像是一个轻量级、独立的可执行软件包,包含运行应用程序所需的一切:代码、运行时环境、库、环境变量和配置文件。

  • 容器(Container):容器是镜像的运行实例。它可以被启动、开始、停止、移动和删除。每个容器都是相互隔离的、保证安全的平台。
  • 仓库(Repository):Docker仓库是用来存储和分发Docker镜像的地方。最著名的公共仓库是Docker Hub。
  • Dockerfile:Dockerfile是一个文本文件,包含一系列指令,用于构建Docker镜像。
  • Docker Compose:Docker Compose是一个工具,用于定义和运行多容器Docker应用程序。通过一个YAML文件,可以配置应用程序的服务,然后使用一个命令来启动所有服务。

3.3 为什么选择Docker进行部署

选择Docker进行部署有以下几个主要原因:

  • 一致的运行环境:Docker确保应用在开发、测试和生产环境中的运行环境一致,减少“在我的机器上可以运行”的问题。
  • 快速部署和扩展:Docker容器可以快速启动和停止,使得部署新版本或扩展服务变得非常迅速。
  • 资源高效利用:Docker容器共享主机系统的内核,不需要额外的虚拟化层,因此资源利用率更高。
  • 易于管理:Docker提供了一套完整的工具链,包括镜像管理、容器编排等,使得应用的部署和管理变得更加简单。
  • 生态系统支持:Docker拥有一个庞大的生态系统,包括各种官方和社区维护的镜像、工具和插件,可以满足各种部署需求。

4. 构建高并发Flask应用

在构建高并发Flask应用时,需要考虑应用的设计、代码优化以及服务器配置等多个方面。

4.1 设计高并发Flask应用的策略

设计高并发Flask应用时,应考虑以下策略:

  • 异步处理:对于I/O密集型任务,可以使用异步编程模型来提高并发处理能力。
  • 缓存机制:使用缓存可以减少数据库查询和计算,提高响应速度。
  • 横向扩展:通过增加服务器实例来处理更多的并发请求。
  • 负载均衡:使用负载均衡器将请求分发到多个服务器实例,提高系统的整体处理能力。

4.2 优化Flask应用代码

优化Flask应用代码可以从以下几个方面入手:

  • 减少数据库查询:通过使用数据库索引、查询优化和缓存来减少数据库查询次数。
  • 使用轻量级模板:避免在模板中使用复杂的逻辑,减少模板渲染时间。
  • 异步任务:将耗时的任务(如发送邮件、数据处理)移到后台异步执行。

以下是一个简单的Flask应用示例,展示了如何使用缓存和异步任务:

from flask import Flask, jsonify
from flask_caching import Cache
import asyncioapp = Flask(__name__)
cache = Cache(app, config={'CACHE_TYPE': 'simple'})@app.route('/data')
@cache.cached(timeout=60)
def get_data():data = fetch_data_from_database()return jsonify(data)async def async_task():await asyncio.sleep(5)  # Simulate a long-running taskreturn "Task completed"@app.route('/async-task')
def run_async_task():loop = asyncio.new_event_loop()asyncio.set_event_loop(loop)result = loop.run_until_complete(async_task())loop.close()return jsonify({"result": result})def fetch_data_from_database():# Simulate fetching data from a databasereturn {"key": "value"}if __name__ == '__main__':app.run(debug=True)

4.3 配置Gunicorn以支持高并发

Gunicorn的配置对于支持高并发至关重要。以下是一些关键的配置选项:

  • workers:指定工作进程的数量,通常设置为CPU核心数的两倍。
  • bind:指定Gunicorn绑定的地址和端口。
  • worker_class:指定工作进程的类型,如syncgeventeventlet
  • timeout:设置工作进程的超时时间,防止进程长时间占用资源。

以下是一个Gunicorn配置文件示例:

# gunicorn_config.py
import multiprocessingbind = '0.0.0.0:8000'
workers = multiprocessing.cpu_count() * 2 + 1
worker_class = 'gevent'
timeout = 120

启动Gunicorn时,可以使用以下命令:

gunicorn -c gunicorn_config.py your_flask_app:app

通过这些配置,Gunicorn可以更好地支持高并发请求,确保Flask应用在高流量情况下的稳定性和性能。

5. Dockerizing Flask与Gunicorn

将Flask应用和Gunicorn服务器容器化是实现高并发部署的关键步骤。通过Docker,我们可以确保应用在不同环境中的一致性,并简化部署流程。

5.1 创建Dockerfile

Dockerfile是一个文本文件,包含一系列指令,用于构建Docker镜像。以下是一个简单的Dockerfile示例,用于构建包含Flask应用和Gunicorn服务器的镜像:

# 使用官方Python运行时作为基础镜像
FROM python:3.8-slim# 设置工作目录
WORKDIR /app# 将当前目录内容复制到工作目录
COPY . /app# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt# 暴露端口
EXPOSE 8000# 定义环境变量
ENV FLASK_ENV=production# 运行Gunicorn
CMD ["gunicorn", "-c", "gunicorn_config.py", "your_flask_app:app"]

在这个Dockerfile中:

  • FROM python:3.8-slim:使用官方Python 3.8 slim镜像作为基础镜像。
  • WORKDIR /app:设置工作目录为/app
  • COPY . /app:将当前目录内容复制到工作目录。
  • RUN pip install --no-cache-dir -r requirements.txt:安装应用依赖。
  • EXPOSE 8000:暴露8000端口,这是Gunicorn默认监听的端口。
  • ENV FLASK_ENV=production:设置Flask环境为生产环境。
  • CMD ["gunicorn", "-c", "gunicorn_config.py", "your_flask_app:app"]:使用Gunicorn启动Flask应用,并指定配置文件。

5.2 配置Docker Compose

Docker Compose是一个工具,用于定义和运行多容器Docker应用程序。通过一个YAML文件,可以配置应用程序的服务,然后使用一个命令来启动所有服务。

以下是一个简单的Docker Compose配置文件示例:

version: '3'
services:web:build: .ports:- "8000:8000"volumes:- .:/appenvironment:- FLASK_ENV=production

在这个docker-compose.yml文件中:

  • version: '3':指定Docker Compose文件格式版本。
  • services:定义服务。
    • web:定义一个名为web的服务。
      • build: .:指定构建上下文为当前目录。
      • ports: - "8000:8000":将主机的8000端口映射到容器的8000端口。
      • volumes: - .:/app:将当前目录挂载到容器内的/app目录。
      • environment: - FLASK_ENV=production:设置环境变量。

5.3 构建与运行Docker镜像

构建Docker镜像并运行容器的步骤如下:

  1. 构建镜像:在包含Dockerfile的目录中运行以下命令:

    docker build -t your_flask_app .
    

    这将会根据Dockerfile构建一个名为your_flask_app的镜像。

  2. 运行容器:使用Docker Compose启动服务:

    docker-compose up
    

    这将会根据docker-compose.yml文件启动服务,并在端口8000上运行Flask应用。

通过这些步骤,Flask应用和Gunicorn服务器已经被容器化,并且可以通过Docker Compose进行管理和部署。

6. 高并发部署实战

在这里插入图片描述

6.1 部署前的准备工作

在部署高并发Web服务之前,需要进行以下准备工作:

  • 环境检查:确保目标部署环境的配置满足高并发需求,包括足够的CPU、内存和网络带宽。
  • 依赖安装:确保所有依赖项都已正确安装,并且在不同环境中保持一致。
  • 配置文件:检查并确认所有配置文件(如Gunicorn配置文件、Docker Compose文件)都已正确设置。

6.2 使用负载均衡器

负载均衡器是提高Web服务高并发处理能力的关键组件。它可以将请求分发到多个服务器实例,从而提高系统的整体处理能力。以下是一个使用Nginx作为负载均衡器的示例配置:

http {upstream flask_app {server web_app_1:8000;server web_app_2:8000;server web_app_3:8000;}server {listen 80;location / {proxy_pass http://flask_app;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}
}

在这个Nginx配置中:

  • upstream flask_app:定义一个名为flask_app的上游服务器组,包含三个服务器实例。
  • server:定义一个监听80端口的虚拟服务器,将所有请求转发到flask_app上游服务器组。

6.3 监控与日志管理

监控和日志管理对于高并发Web服务的稳定运行至关重要。以下是一些常用的监控和日志管理工具:

  • 监控工具:如Prometheus、Grafana,用于收集和可视化系统指标。
  • 日志管理工具:如ELK Stack(Elasticsearch, Logstash, Kibana),用于收集、存储和分析日志。

以下是一个简单的Gunicorn日志配置示例:

# gunicorn_config.py
accesslog = "/var/log/gunicorn/access.log"
errorlog = "/var/log/gunicorn/error.log"
loglevel = "info"

6.4 性能测试与调优

性能测试和调优是确保高并发Web服务性能的关键步骤。以下是一些常用的性能测试和调优方法:

  • 压力测试:使用工具如Apache JMeter或Locust进行压力测试,模拟高并发请求。
  • 性能分析:使用性能分析工具如cProfile或Pyflame分析应用的性能瓶颈。
  • 调优:根据性能分析结果,调整Gunicorn配置、Flask应用代码或数据库查询,以提高性能。

以下是一个简单的Locust性能测试脚本示例:

from locust import HttpUser, task, betweenclass WebsiteUser(HttpUser):wait_time = between(5, 15)@taskdef index(self):self.client.get("/")

通过运行Locust,可以模拟用户行为并对Web服务进行压力测试,从而发现性能瓶颈并进行调优。

7. 结论

在本文中,我们探讨了如何使用Gunicorn、Flask和Docker构建一个高并发的Web服务。通过结合这些技术,可以实现一个既灵活又高效的Web应用部署模型。

7.1 总结Gunicorn、Flask与Docker的优势

  • Gunicorn

    • 作为WSGI服务器,Gunicorn提供了高性能和可扩展的Web应用运行环境。
    • 多进程模型支持高并发处理,充分利用多核CPU。
    • 支持异步工作模式,适用于I/O密集型应用。
  • Flask

    • 轻量级Web框架,易于学习和使用。
    • 高度可定制和扩展,通过丰富的扩展支持复杂功能。
    • 良好的社区支持和大量的第三方库。
  • Docker

    • 提供一致的运行环境,确保应用在不同环境中的一致性。
    • 轻量级容器化技术,资源利用率高,部署速度快。
    • 支持自动化部署和扩展,简化运维工作。
    • 强大的社区和生态系统,易于集成其他技术。

7.2 未来展望与技术趋势

随着技术的不断发展,我们可以期待以下几个趋势:

  • 容器编排:容器编排工具如Kubernetes将继续发展,提供更加强大和灵活的容器管理能力。
  • 服务网格:服务网格技术如Istio和Linkerd将变得更加流行,提供更细粒度的服务间通信控制和监控。
  • Serverless:Serverless架构将逐渐成为主流,开发者可以更专注于应用开发,而不必担心服务器管理。
  • AI与ML:人工智能和机器学习将在Web服务的开发和优化中发挥越来越重要的作用,提供自动化的性能调优和异常检测。
  • 持续集成与持续部署(CI/CD):CI/CD将继续推动软件开发的自动化和持续优化。

通过利用这些技术趋势,我们可以进一步优化Gunicorn、Flask和Docker结合的高并发Web服务,实现更高效、更可靠和更智能的应用部署。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3279634.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

0730作业+梳理

一、作业 代码&#xff1a; #include<myhead.h> int main(int argc, const char *argv[]) { //判断文件个数 if(argc ! 3) { write(2,"input file error\n",sizeof("input file error\n")); return -1; } int …

图片的存储

1.更换头像 //里面内容是调用方法将选择的电脑图片存储进字节数组&#xff0c;在转发给服务端&#xff0c;在服务端中进行保存。 void changeimageButtonOnAction(ActionEvent event)throws IOException, ClassNotFoundException, SQLException {FileChooser fileChooser n…

30岁决心转行,AI太香了

今天是一篇老学员的经历分享&#xff0c;此时的王同学在大洋彼岸即将毕业&#xff0c;手握多家北美大厂offer&#xff0c;一片明媚。谁能想到王同学的转码之路竟始于一场裁员&#xff0c;这场访谈拉开了他的回忆。 最近总刷到一些关于转行的话题&#xff0c;很多刚毕业的同学喜…

【Golang 面试 - 进阶题】每日 3 题(八)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

物理数据库迁移到云上

物理数据库迁移到云上 物理数据库迁移到云上通常需要以下步骤: 评估和规划 评估物理数据库的需求和约束条件&#xff0c;确定迁移的目标。考虑数据库大小、性能要求、数据复杂性等因素&#xff0c;选择合适的云服务提供商和服务模式。 设置云环境 在云平台上创建适当的虚拟…

Anaconda配置记录-linux环境

Anaconda Distribution 是一个 Python/R 数据科学分发&#xff0c;其中包含&#xff1a; conda - 用于命令行界面的包和环境管理器 Anaconda Navigator - 基于 conda 构建的桌面应用程序&#xff0c;具有从托管环境中启动其他开发应用程序的选项 超过 300 个自动安装的软件包…

嵌入式初学-C语言-八

#接嵌入式初学-C语言-七# 分支结构 分支结构&#xff1a;又被称之为选择结构 选择结构的形式 多分支 语法&#xff1a; if(条件1) { 语句1; } else if(条件2) { 语句2; } ... else { 语句n1; }案例&#xff1a; #include <stdio.h> int main() { // 需求&#xff…

Java中适配Redis单机和集群模式

/** * 根据配置创建Redis连接工厂 * 支持单机和集群模式 * */ application.properties配置文件 Redis配置类&#xff1a; package com.t6bi.carrier.app.config;import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotat…

鱼眼相机在FOV比较大时, undistortPoint() 和 undistortImage() 结果相差很大

在做鱼眼图像矫正时&#xff0c;碰到一个很有意思的情况&#xff0c;即在鱼眼相机FOV比较大时&#xff0c; undistortPoint() 和 undistortImage()对应点的结果不一致。 两个函数的调用如下&#xff1a; 浅蓝色的点是画在原始图像上的。 浅蓝色的点随着图像undistortImage()矫…

科大讯飞语音转写demo go语言版

上传了一个语音文件&#xff0c;识别效果。 package audioimport ("bytes""crypto/hmac""crypto/md5""crypto/sha1""encoding/base64""encoding/json""fmt""io/ioutil""net/http"…

商用密码测评之对HTTPS(TLS)协议中各个参数解释

1、TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 是一个广泛使用的TLS&#xff08;传输层安全协议&#xff09;加密套件&#xff0c;它结合了多种技术和算法来确保网络通信的安全。下面是对该加密套件中各个参数的详细解释&#xff1a; 1. TLS 定义&#xff1a;TLS&#xff08;传…

Spring源码-加载配置文件spring-${username}.xml变量名的解析

启动类: ApplicationContext ac new ClassPathXmlApplicationContext("spring-${username}.xml");Person bean ac.getBean(Person.class);调用链路如下&#xff1a; parseStringValue:130, PropertyPlaceholderHelper (org.springframework.util) replacePlacehold…

【Linux】make/Makefile的理解

1.make是一个命令&#xff0c;makefile是一个文件, 依赖关系和依赖方法. a.快速使用一下 i.创建一个Makefile文件(首字母也可以小写) b.依赖关系和依赖方法 i.依赖关系: 我为什么要帮你? mybin:mytest.c ii.依赖方法: 怎么帮? gcc -o mybin mytest.c make之前要注意先创建…

Pinely Round 4 (Div. 1 + Div. 2)(A~D)

A. Maximize the Last Element 思路: 签到题,判断每个数前面和后面数的数量能否被2整除,如果都能就可以得到,然后求最大值就行 代码: #include<bits/stdc.h> #include <unordered_map> using namespace std; #define N 200010 typedef long long ll; typedef un…

【源码阅读】Redisson lock源码

Redisson 加锁非常简单&#xff0c;还支持 redis 单实例、redis 哨兵、redis cluster、redis master-slave 等各种部署架构 RLock lock redisson.getLock("cyk-test"); lock.lock(); lock.unlock(); 底层原理 加锁机制 废话不多说&#xff0c;直接看源码&#xf…

从 Pandas 到 Polars 三十九:Polars 和 Matplotlib

Polars 与 matplotlib 配合得很好。 在matplotlib中&#xff0c;你可以直接使用polars的数据进行绘制图形&#xff0c;而无需把polars的dataframe转为pandas的dataframe&#xff1a; import polars as pl import matplotlib.pyplot as plt# 创建一个polars DataFrame df_pl …

店铺销售数据中心大屏,引领智慧决策新风尚

为了精准把握市场动态&#xff0c;高效驱动业务增长&#xff0c;越来越多的商家开始拥抱“智慧零售”的浪潮&#xff0c;山海鲸可视化搭建的店铺销售数据中心大屏&#xff0c;以直观、智能、高效的方式&#xff0c;为商家开启了一扇通往未来商业视界的大门。 想象一下&#xff…

探索目标检测算法:科技核心的力量

1. 引言 - 目标检测算法的重要性 在当今的科技时代&#xff0c;计算机视觉技术已经渗透到我们生活的方方面面。从自动驾驶汽车、无人机监控、智能安防、医疗影像分析到工业自动化&#xff0c;目标检测算法作为计算机视觉领域的核心技术之一&#xff0c;其重要性不言而喻。目标检…

01 - 计算机组成原理与体系结构

文章目录 一&#xff0c;计算机系统硬件基本组成硬件软件 二&#xff0c;CPU的功能与组成功能组成运算器控制器 三&#xff0c;数据表示计算机的基本单位进制转换原码&#xff0c;反码&#xff0c;补码&#xff0c;移码数值表示范围浮点数表示 四&#xff0c;寻址五&#xff0c…

《LeetCode热题100》---<双指针篇四道②>

本篇博客讲解LeetCode热题100道双指针篇中的 第三道&#xff1a;三数之和&#xff08;中等&#xff09; 第四道&#xff1a;接雨水&#xff08;困难&#xff09; 第三道&#xff1a;三数之和&#xff08;中等&#xff09; 法一&#xff1a;暴力枚举&#xff08;三重循环&#x…