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

websocket_asyncio

WebSocket 和 asyncio 指南

在这里插入图片描述

简介

本指南涵盖了使用 Python 中的 websockets 库进行 WebSocket 编程的基础知识,以及 asyncio 在异步非阻塞 I/O 中的作用。它提供了构建高效 WebSocket 服务端和客户端的知识,以及 asyncio 的特性和优势。


1. 什么是 WebSocket?

  • WebSocket 是一种全双工通信协议,它通过单个持久连接实现客户端与服务端之间的实时数据交换。
  • 它非常适合需要低延迟和实时通信的应用,例如:
    • 聊天应用
    • 实时流媒体
    • 实时数据推送

WebSocket 的特点:

  1. 全双工通信。
  2. 低延迟数据传输。
  3. 持久连接。

2. 什么是 asyncio

asyncio 是 Python 提供的用于异步编程的库,能够高效处理 I/O 密集型操作。它允许在单线程中同时运行多个任务,而无需阻塞。

主要特性:

  1. 非阻塞 I/O: 执行文件或网络等任务时不会阻塞程序。
  2. 并发: 在不使用线程或进程的情况下高效处理大量任务。
  3. 事件循环: 管理异步任务的调度和执行。
  4. 任务管理: 支持协程、async/await 语法和任务调度(如 asyncio.gatherasyncio.create_task)。

3. 使用 asyncio 编写 WebSocket 服务端

代码示例:

import asyncio
import websockets# WebSocket 处理函数
async def handle_connection(websocket, path):print("新的客户端已连接")try:async for message in websocket:print(f"接收到:{message}")await websocket.send(f"回显:{message}")except websockets.ConnectionClosed:print("客户端断开连接")# 启动 WebSocket 服务端
start_server = websockets.serve(handle_connection, "localhost", 12345)# 运行服务端
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

工作原理:

  1. 服务端在 localhost:12345 上监听 WebSocket 连接。
  2. 每个客户端连接由协程 handle_connection() 处理。
  3. 服务端可以异步发送和接收消息。

4. 使用 asyncio 编写 WebSocket 客户端

代码示例:

import asyncio
import websocketsasync def client():uri = "ws://localhost:12345"async with websockets.connect(uri) as websocket:await websocket.send("你好,服务端!")response = await websocket.recv()print(f"服务端回应:{response}")asyncio.run(client())

工作原理:

  1. 客户端连接到位于 localhost:12345 的 WebSocket 服务端。
  2. 客户端发送一条消息,并等待服务端的回应。

5. asyncio 在 WebSocket 编程中的作用

asyncio 为高效处理 WebSocket 通信提供了基础。以下是它在 WebSocket 服务端和客户端中的支持方式:

关键作用:

  1. 并发: 在服务端中同时处理多个客户端连接。
    • 示例:每个客户端连接作为单独的协程运行(async def)。
  2. 非阻塞 I/O: 执行 I/O 操作(例如发送/接收消息)时不会阻塞其他任务。
  3. 事件循环: 事件循环协调协程的执行,确保响应性。
  4. 任务调度:
    • 使用 asyncio.create_task() 调度后台任务。
    • 使用 asyncio.gather() 并发执行多个任务。

并发 WebSocket 服务端示例:

async def handle_connection(websocket, path):async for message in websocket:print(f"接收到:{message}")await websocket.send(f"回显:{message}")start_server = websockets.serve(handle_connection, "localhost", 12345)asyncio.run(start_server)

每个客户端连接在自己的协程中运行,从而支持并发。


6. 使用 WebSocket 和 asyncio 的优势

  1. 可扩展性: 高效处理数千个连接。
  2. 低开销: 避免线程或进程的额外开销。
  3. 响应性: 快速响应 I/O 事件。
  4. 代码简洁: 使用 async/await 编写的异步代码可读性强。

7. 示例工作流:WebSocket 服务端和客户端

服务端:

  • 异步处理客户端连接。
  • 并发处理消息,并返回响应。

客户端:

  • 连接到服务端。
  • 异步发送和接收消息。

8. 常见问题与解决方法

1. 并发处理

  • 使用 asyncio.gather()asyncio.create_task() 管理多个连接。

2. 连接管理

  • 使用 try-except 块优雅地处理连接中断或错误。

3. 安全连接

  • 使用 SSL/TLS,通过提供证书和密钥配置 websockets

9. 真实案例

  1. 聊天应用: 实现实时消息传递。
  2. 实时数据推送: 如体育比分、股票价格。
  3. 协作工具: 文档实时共享编辑。
  4. 流媒体: 音频或视频流。

10. 总结

WebSocket 和 asyncio 的结合为构建实时、可扩展的应用程序提供了强大框架。利用 asyncio 的非阻塞特性,可以高效管理 WebSocket 连接,确保客户端和服务端的实时通信。

进一步阅读:

  • asyncio 官方文档
  • websockets 官方文档

此文档从基础概念到实践应用以及潜在挑战进行了全面介绍,旨在帮助理解如何使用 asyncio 和 WebSocket 进行高效编程。

相关文章:

websocket_asyncio

WebSocket 和 asyncio 指南 简介 本指南涵盖了使用 Python 中的 websockets 库进行 WebSocket 编程的基础知识,以及 asyncio 在异步非阻塞 I/O 中的作用。它提供了构建高效 WebSocket 服务端和客户端的知识,以及 asyncio 的特性和优势。 1. 什么是 WebS…...

如何在NGINX中实现基于IP的访问控制(IP黑白名单)?

大家好,我是锋哥。今天分享关于【如何在NGINX中实现基于IP的访问控制(IP黑白名单)?】面试题。希望对大家有帮助; 如何在NGINX中实现基于IP的访问控制(IP黑白名单)? 1000道 互联网大…...

Y3编辑器文档4:触发器1(界面及使用简介、变量作用域、入门案例)

文章目录 一、触发器简介1.1 触发器界面1.2 ECA语句编辑及快捷键1.3 参数设置1.4 变量设置1.5 实体触发器1.6 触发器复用 二、触发器的多层结构2.1 子触发器(在游戏内对新的事件进行注册)2.2 触发器变量作用域 三、入门案例3.1 使用触发器实现瞬间移动3.…...

echarts图表自定义配置(二)——代码封装

下图是初版,火山图的代码。可以看出,里面的变量,逻辑,函数存在冗余,基本上都是改了参数,同样的get和set,去刷新图表;对于往后继续开发十几二十个图表,会很麻烦。因此需要…...

02、10个富士胶片模拟的设置

二色彩 1、色彩的加减控制全局的饱和度增减; 2、色彩效果只提升暖色系饱和度; 3、FX蓝色大幅度提升蓝色系饱和度; 4、三个参数都不改变颜色的色相。 2.1 色彩 色彩调整的是拍摄画面整体的色彩饱和程度 2.2色彩效果 调整的是画面中暖色…...

鸿蒙系统-前端0帧起手

鸿蒙系统-前端0帧起手 先search 一番 找到对应的入门文档1. 运行项目遇到问题 如下 (手动设计npm 的 registry 运行 npm config set registry https://registry.npmjs.org/)2.运行后不支持一些模拟器 配置一下(如下图,运行成功&am…...

211-基于FMC的1路1.5G ADC 1路 2.5G DAC子卡

一、板卡概述 FMC-1AD-1DA-1SYNC是我司自主研发的一款1路1G AD采集、1路2.5G DA回放的FMC、1路AD同步信号子卡。板卡采用标准FMC子卡架构,可方便地与其他FMC板卡实现高速互联,可广泛用于高频模拟信号采集等领域。 二、功能介绍 2.1 原理框图 2.2 硬件…...

获取微信用户openid

附上开发文档:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html 开发之前,准备事项 一个已认证过的服务号|基本信息配置js域名和网站授权域名配置最后确认当前账号网页授权功能是否开通,没有开通的无法获取到用户授权开发人…...

MultiRECloudSim使用

MultiRECloudSim使用 简介 MultiRECloudSim是一个用于云计算环境下的模拟器相关工具,它主要用于模拟和评估云计算中的资源分配、任务调度等多种场景。它可能是基于CloudSim这个基础的云计算模拟器进行扩展而来,CloudSim提供了基本的云计算模拟功能,如数据中心、虚拟机、任务…...

智能设备安全-固件逆向分析

固件逆向分析实验报告-20241022 使用固件常用逆向分析工具,对提供的固件进行文件系统提取,并记录逆向分析实验过程,提交实验报告(报告要求图文并茂,对涉及到的关键步骤附截图说明)。具体任务如下&#xff1…...

【小白包会的】使用supervisor 管理docker内多进程

使用supervisor 管理docker内多进程 一般情况下,一个docker是仅仅运行一个服务的 但是有的情况中,希望一个docker中运行多个进程,运行多个服务,也就是一个docker容器执行多个服务。 调研了一下,发现可以通过**super…...

使用navicat新旧版本,连接PostgreSQL高版本报错问题图文解决办法

使用navicat新旧版本,连接PostgreSQL高版本报错问题图文解决办法 一、问题现象:二、出现原因三、解决方法:1、升级Navicat版本:2、使用低版本的postgreSQL:3、修改Navicat的dll二进制文件:navicat版本15nav…...

IDEA 未启用lombok插件的Bug

项目中maven已引用了lombok依赖,之前运行没有问题的,但有时启动会提示: java: You arent using a compiler supported by lombok, so lombok will not work and has been disabled. Your processor is: com.sun.proxy.$Proxy8 Lombok support…...

认识GO--gRPC的metadata

参考: 写给go开发者的gRPC教程-metadata-CSDN博客https://blog.csdn.net/kevin_tech/article/details/129395177?ops_request_misc%257B%2522request%255Fid%2522%253A%25221f2f2e26f48c755c33344ccb171a49fc%2522%252C%2522scm%2522%253A%252220140713.130102334…...

2024年安徽省职业院校技能大赛信息安全管理与评估

一、赛项名称 赛项名称:信息安全管理与评估 英文名称:Information Security Management and Evaluation 赛项组别:高职组 赛项归属:电子信息大类 二、竞赛目标 通过赛项检验参赛选手熟悉信息安全行业标准规范和信息 安全测试员新职…...

Perl 引用

Perl 引用 Perl,作为一种灵活而强大的编程语言,广泛用于系统管理、网络编程、GUI开发等领域。在Perl编程中,引用(References)是一个核心概念,它允许变量引用其他数据,从而创建复杂的数据结构&a…...

RT-Thread启动过程 :从汇编开始的启动流程

这个系列参考了《嵌入式实时操作系统RT-Thread设计与实现》,会详细介绍RT-Thread的启动流程,即是如何从零开始在开发板上运行起一个RTOS内核的。本文将会以 ch32v307VCT6 开发板为例展开进行详细介绍。主要包括:startup.S、初始化与系统相关的…...

Scala—“==“和“equals“用法(附与Java对比)

Scala 字符串比较—""和"equals"用法 Scala 的 在 Scala 中, 是一个方法调用,实际上等价于调用 equals 方法。不仅适用于字符串,还可以用于任何类型,并且自动处理 null。 Demo: Java 的 在 J…...

$route和$router的区别

在 Vue.js 中,$route 和 $router 都是 Vue Router 提供的对象,但它们有不同的用途和功能。 1. $router $router 是 Vue Router 实例的引用,它允许你通过 JavaScript 进行路由的控制和导航。你可以通过 $router 来执行路由的操作&#xff0c…...

[工具升级问题] 钉钉(linux版)升级带来的小麻烦

本文由Markdown语法编辑器编辑完成。 1. 背景: 今日钉钉又发布了新的升级版本。由于我工作时使用的是Ubuntu 20.04版本,收到的升级推送信息是,可以升级到最新的7.6.25-Release版本。根据钉钉官方给出的历次更新版说明,这个新的版本&#xf…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

基于服务器使用 apt 安装、配置 Nginx

🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

【机器视觉】单目测距——运动结构恢复

ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛&#xf…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM&#xff09…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...