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

使用Sanic和SSE实现实时股票行情推送


💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
在这里插入图片描述

  • 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~

  • 专栏导航

    • Python系列: Python面试题合集,剑指大厂
    • Git系列: Git操作技巧
    • GO系列: 记录博主学习GO语言的笔记,该笔记专栏尽量写的试用所有入门GO语言的初学者
    • 数据库系列: 详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 运维系列: 总结好用的命令,高效开发
    • 算法与数据结构系列: 总结数据结构和算法,不同类型针对性训练,提升编程思维

    非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

    💖The Start💖点点关注,收藏不迷路💖

    📒文章目录

      • 什么是Server-Sent Events (SSE)
      • 为什么选择Sanic
      • 实现步骤
        • 1. 安装依赖
        • 2. 创建Sanic应用
        • 3. 前端实现
        • 4. 避免跨域问题
        • 5. 优化与扩展
      • 总结


实时数据推送已经成为了许多应用的关键功能之一,尤其是在金融、监控、社交媒体等领域。本文将深入探讨如何使用Sanic框架结合Server-Sent Events (SSE)技术,实现用户在浏览器中选择不同股票并实时接收对应的股票行情推送。本文将重点介绍实现步骤、技术细节以及实际使用中的一些优化建议。

在这里插入图片描述

什么是Server-Sent Events (SSE)

Server-Sent Events (SSE) 是一种轻量级的服务器推送技术,允许服务器向客户端推送数据。与WebSocket相比,SSE相对简单,特别适合需要单向数据流的应用场景,比如新闻推送、股票行情、实时通知等。

SSE的优势包括:

  1. 简单易用:使用HTTP协议,无需复杂的握手过程。
  2. 自动重连:浏览器原生支持自动重连机制,当连接断开时,客户端会自动尝试重新连接。
  3. 轻量级:非常适合频繁的数据推送,尤其是在数据更新频率较高的场景中。

为什么选择Sanic

Sanic是一个基于Python的异步Web框架,以其高性能和简单易用的API广受欢迎。Sanic天然支持异步操作,特别适合处理SSE这样的长连接请求。

使用Sanic和SSE的结合,可以轻松地实现高效的实时数据推送服务,特别是在股票行情等对实时性要求高的场景下。

实现步骤

接下来,我们将一步步实现一个简单的实时股票行情推送服务,用户可以在浏览器中选择股票并接收对应的实时行情。

1. 安装依赖

首先,确保已安装Sanic和其他必要的库。可以通过以下命令安装:

pip install sanic

2. 创建Sanic应用

接下来,创建一个Sanic应用,并实现一个简单的SSE数据流。我们将模拟几个股票的实时数据,并根据用户的选择推送相应的股票行情。

from sanic import Sanic, response
import asyncio
import timeapp = Sanic("StockSSE")# 模拟股票行情数据
stock_data = {"AAPL": {"stock_name": "Apple", "price": 150.00, "change": 0.25},"GOOG": {"stock_name": "Google", "price": 2750.00, "change": -10.00},"AMZN": {"stock_name": "Amazon", "price": 3400.00, "change": 15.00}
}async def stock_data_generator(stock_symbol):while True:data = stock_data.get(stock_symbol, {})data['timestamp'] = time.time()yield f"data: {response.json(data)}\n\n"await asyncio.sleep(1)@app.route("/stock/<stock_symbol>")
async def stock_stream(request, stock_symbol):async def stock_stream(res):async for data in stock_data_generator(stock_symbol):await res.write(data)return response.stream(stock_stream, content_type='text/event-stream')if __name__ == "__main__":app.run(host="0.0.0.0", port=8000)

在这个示例中,我们定义了一个简单的股票数据模拟器,并使用/stock/<stock_symbol>路由来处理SSE请求。通过stock_data_generator生成器函数,我们可以持续不断地向客户端推送股票数据。

3. 前端实现

前端使用HTML和JavaScript的EventSource对象来接收服务器推送的数据,并根据用户选择的股票更新显示内容。以下是一个简单的HTML页面,用户可以选择股票,并实时查看对应的行情。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>实时股票行情</title><style>body {font-family: Arial, sans-serif;}.stock-data {margin: 20px;padding: 10px;border: 1px solid #ddd;}select {margin: 20px;padding: 5px;}</style>
</head>
<body><h1>实时股票行情</h1><select id="stock-select"><option value="Apple">Apple</option><option value="GOOG">Google</option><option value="AMZN">Amazon</option></select><div id="stock-container"><div class="stock-data" id="stock-data">选择一个股票查看其行情数据...</div></div><script>let eventSource;const stockSelect = document.getElementById('stock-select');const stockDataDiv = document.getElementById('stock-data');function updateStock(stockSymbol) {if (eventSource) {eventSource.close();}eventSource = new EventSource(`/stock/${stockSymbol}`);eventSource.onmessage = function(event) {const stockData = JSON.parse(event.data);stockDataDiv.innerHTML = `股票名称: ${stockData.stock_name}<br>当前价格: ${stockData.price}<br>涨跌幅: ${stockData.change}<br>时间戳: ${stockData.timestamp}<br>`;};eventSource.onerror = function(event) {console.error('SSE 连接错误:', event);};}stockSelect.addEventListener('change', function() {const selectedSymbol = stockSelect.value;updateStock(selectedSymbol);});// 初始化加载第一个股票的数据updateStock(stockSelect.value);</script>
</body>
</html>

这个前端页面非常简单,通过JavaScript监听股票选择器的变化,并根据用户选择的股票启动新的SSE连接,实时更新行情数据。

4. 避免跨域问题

在实际应用中,跨域请求可能会导致浏览器拒绝连接。如果前端与后端不在同一个域下,可以使用Sanic的file函数直接返回HTML页面,确保所有请求都来自同一域,从而避免跨域问题。

from sanic import response
@app.route("/")
async def index(request):return await response.file('static/index.html')

将HTML文件放置在static目录下,并通过Sanic的路由直接返回该文件。这样,前端页面和数据请求都运行在同一个域下,消除了跨域问题。

5. 优化与扩展

在实际项目中,以下几点优化建议可以帮助你进一步提升系统的性能和用户体验:

  1. 数据源优化: 如果需要处理真实的股票数据,可以将get_stock_data函数扩展为从外部API获取实时数据。
  2. 推送频率: 根据业务需求,调整数据推送的频率,或者仅在数据发生变化时推送更新,以减少不必要的流量和资源占用。
  3. 错误处理: 添加错误处理机制,如在SSE连接断开时提供用户友好的提示,或在数据请求失败时进行重试。
  4. 负载均衡: 在高并发场景下,可以使用Nginx等反向代理服务器对Sanic服务进行负载均衡,确保服务的稳定性和高可用性。

总结

通过本文的介绍,开发者可以轻松实现一个基于Sanic和SSE的实时股票行情推送服务。该技术方案不仅简单高效,而且能够满足金融应用中对实时数据推送的高要求。在实际应用中,通过合理的优化和扩展,可以构建出性能卓越、用户体验良好的实时数据推送系统。

希望这篇文章能为你在实际开发中提供有价值的参考。未来,你可以将这些技术应用到更多的实时数据场景中,如新闻推送、社交媒体通知、监控报警等,为用户提供更加动态和互动的体验。


🔥🔥🔥道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

💖The End💖点点关注,收藏不迷路💖

相关文章:

使用Sanic和SSE实现实时股票行情推送

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…...

redis散列若干记录

字典 redis本身使用字典结构管理数据 redis使用hash表实现字典结构 使用了什么hash算法 使用SipHash算法&#xff0c;该算法能有效防止Hash表碰撞&#xff0c;并有不错的性能 hash冲突怎么解决 使用链表法解决hash冲突 hash表如何扩容 渐进式扩容&#xff0c;不会引起线程长期阻…...

Java面试八股之什么是STOMP协议

什么是STOMP协议 STOMP&#xff08;Simple Text Oriented Messaging Protocol&#xff09;是一种为消息队列和事件驱动架构设计的轻量级协议&#xff0c;主要用于在消息中间件之间进行消息交换。它的设计原则是简单、跨平台和易于实现&#xff0c;这使得STOMP成为许多实时应用…...

【自用】Python爬虫学习(一):爬虫基础与四个简单案例

Python爬虫学习&#xff08;一&#xff09; 基础知识四个简单的爬虫案列1.使用urlopen获取百度首页并保存2.获取某翻译单词翻译候选结果3.获取某网页中的书名与价格4.获取某瓣排名前250的电影名称 基础知识 对于一个网页&#xff0c;浏览器右键可以查看页面源代码&#xff0c;…...

[python]uiautomation.WindowControl函数用法

Python UIAutomation 窗口控件 介绍 在本文中&#xff0c;我们将探讨Python UIAutomation库以及如何使用它来控制和自动化Windows应用程序。我们将介绍UIAutomation的基础知识及其功能&#xff0c;并提供代码示例来演示其用法。 什么是UI自动化&#xff1f; UIAutomation是一个…...

学习记录第二十七天

进程 wait函数 功能 等待子进程结束&#xff1a;父进程调用wait函数后&#xff0c;会暂停执行&#xff0c;直到它的某个子进程结束。收集子进程状态&#xff1a;当子进程结束时&#xff0c;wait函数会返回子进程的终止状态&#xff0c;包括是正常终止还是被信号终止等信息。…...

servlet的执行顺序

执行的时候Tomcat先初始化 然后调用 server 根据server来回调请求方式下面会追入源码解释 package com.haogu.servlet;import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.…...

Go语言 类封装和绑定方法

本篇文章主要内容为Go语言类相关操作&#xff1a;封装和绑定方法介绍及示例。 目录 封装 绑定方法 类方法形参 指针形参 设置类方法参数 指针与非指针区别 总结 封装 go语言支持类的操作&#xff0c;但是没有class关键字&#xff0c;使用struct来模拟类。 示例如下&am…...

DirectShow过滤器开发-写WAV音频文件过滤器

下载本过滤器DLL 本过滤器将PCM音频流&#xff0c;或ADPCM&#xff0c;IEEE_FLOAT&#xff0c;ALAW&#xff0c;MULAW&#xff0c;GSM610音频流写入WAV音频文件。 写WAV音频文件过滤器信息 过滤器名称&#xff1a;写WAV 过滤器GUID&#xff1a;{CF704A9C-0C67-4712-BA33-DD0A…...

php根据截止时间计算剩余的时间,并且在剩余时间不足1天时仅显示小时数

//获取政策库文章public function getIndexZckList(){$fl_id = input(fl_id);if(empty(...

Docker最佳实践进阶(一):Dockerfile介绍使用

大家好,上一个系列我们使用docker安装了一系列的基础服务,但在实际开发过程中这样一个个的安装以及繁杂命令不仅仅浪费时间,更是容易遗忘,下面我们进行Docker的进阶教程,帮助我们更快速的部署和演示项目。 一、什么是Dockerfile? Dockerfile 是一个文本文件,其中包含了…...

Anything in Any Scene:无缝融入任何场景,实现逼真视频对象插入技术

人工智能咨询培训老师叶梓 转载标明出处 现实世界的视频捕获虽然因其真实性而宝贵&#xff0c;但常常受限于长尾分布的问题&#xff0c;即常见场景过度呈现&#xff0c;而关键的罕见场景却鲜有记录。这导致了所谓的"分布外问题"&#xff0c;在模拟复杂环境光线、几何…...

安卓开发中的AppCompat框架|安卓系统|安卓应用|兼容性|UI组件|核心组件|ActionBar|Fragment|最佳实践|框架|移动开发|移动应用

目录 1. 什么是AppCompat框架 1.1 AppCompat的起源 1.2 AppCompat的重要性 2. AppCompat框架的核心组件 2.1 AppCompatActivity 2.2 AppCompat主题 2.3 AppCompat Widgets 3. 在项目中使用AppCompat框架 3.1 添加依赖项 3.2 应用AppCompat主题 4. AppCompat的高级功…...

React使用useRef ts 报错

最近在写自己的React项目&#xff0c;我在使用useRef钩子函数的时候发现 TS2322: Type MutableRefObject<HTMLDivElement | undefined> is not assignable to type LegacyRef<HTMLDivElement> | undefined Type MutableRefObject<HTMLDivElement | undefined&g…...

python-信息交互-pyautogui

python-信息交互-pyautogui 一: pyautogui1> waht?2> 功能分类3> 概念及作用二: 通用功能1> function all2> function 注释三: 鼠标控制1> mouse functions2> mouse functions demo3> mouse drag demo四: keyboard控制1> keyboard functions2> …...

flink1.18 编译遇到的问题

1. flink-runtime-web编译失败 源码编译时一直卡在 [INFO] Running ‘npm ci --cache-max0 --no-save’ in 处理方法&#xff1a; 修改flink-runtime-web/pom.xml文件 将<arguments>ci --cache-max0 --no-save ${npm.proxy}</arguments> 替换为&#xff1a;<a…...

2024年8月份编译Openwrt系统基础

概述&#xff1a; 本文档记录openwrt系统的编译过程&#xff0c;以备后续再用&#xff0c;技术支持与指导&#xff01; 1.编译环境 环境需要Linux&#xff0c;我使用的环境是WSL2、Ubuntu 20.04 2.安装编译必须的依赖&#xff08;wsl、linux&#xff09; WSL2&#xff1a;Bu…...

Vue3+vite+ts 项目使用mockjs

1、安装mockjs npm i mockjs 2、安装vite-plugin-mock npm i vite-plugin-mock -D 3、安装axios npm i axios 4.在src目录下创建mock文件夹,在文件夹内创建login.ts等文件&#xff0c;并在文件夹内放置以下内容&#xff08;注&#xff1a;URL要和真实请求地址保持一致&am…...

动态规划(二)——例题

目录 Help Jimmy 题目 解题思路 神奇的口袋 题目 枚举的解法 递归的解法 动态规划的解法 滑雪 题目 解题思路 解法一 解法二 Help Jimmy 题目 "Help Jimmy" 是在下图所示的场景上完成的游戏&#xff1a; 场景中包括多个长度和高度各不相同的平台。地面是…...

Node.js中判断是文件还是文件夹的多种方法

在Node.js中&#xff0c;我们经常需要判断一个路径是文件还是文件夹。Node.js提供了多种方法来实现这一功能&#xff0c;本文将详细介绍这些方法&#xff0c;并给出相应的示例代码。 一、使用fs.Stats对象 在Node.js中&#xff0c;fs模块提供了fs.stat()或fs.statSync()方法&…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...