Sanic 长轮询实现股票行情实时更新

devtools/2024/9/25 21:21:36/

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

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

  • 专栏导航

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

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

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

    📒文章目录

      • 1. 安装依赖包
      • 2. Sanic 服务器端代码
      • 3. 网页客户端代码
      • 4. 代码解析
      • 5. 启动服务器和测试


1. 安装依赖包

pip install sanic
pip install sanic-cors

2. Sanic 服务器端代码

首先,设置 Sanic 服务器来处理股票数据的长轮询请求。服务器将根据用户选择的股票代码返回对应的股票数据。

python">from sanic import Sanic, response
from sanic_cors import CORS, cross_origin
import asyncio
import timeapp = Sanic("StockLongPollingApp")# 启用 CORS
CORS(app)# 模拟的股票行情数据
stock_data = {"A": {"stock_name": "Apple", "price": 150.00, "change": 0.25},"B": {"stock_name": "Google", "price": 2750.00, "change": -10.00},"T": {"stock_name": "Amazon", "price": 3400.00, "change": 15.00}
}# 模拟股票数据更新的任务
async def update_stock_data():while True:# 更新股票价格 (这里只是简单模拟实际应用中可能来自数据库或外部API)for symbol in stock_data:stock_data[symbol]["price"] += (time.time() % 10 - 5) * 0.1stock_data[symbol]["change"] = (time.time() % 2 - 1) * 0.1await asyncio.sleep(10)@app.route("/poll/<stock_symbol>")
@cross_origin(app)  # 为这个路由启用CORS
async def poll_stock(request, stock_symbol):timeout = 30  # 长轮询的超时时间async def wait_for_event():start_time = time.time()last_data = Nonewhile True:# 获取当前股票数据current_data = stock_data.get(stock_symbol, None)if current_data and current_data != last_data:last_data = current_datareturn current_dataelif time.time() - start_time > timeout:return Noneawait asyncio.sleep(1)data = await wait_for_event()if data:return response.json(data)else:return response.json({"message": "No new data"}, status=204)if __name__ == "__main__":# 启动模拟股票数据更新的任务asyncio.ensure_future(update_stock_data())app.run(host="0.0.0.0", port=8000)

3. 网页客户端代码

网页客户端允许用户选择股票,并通过长轮询机制实时获取选定股票的行情数据。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Stock Price Long Polling</title><style>body {font-family: Arial, sans-serif;margin: 20px;}#data {margin-top: 20px;padding: 10px;border: 1px solid #ddd;}select {padding: 5px;margin-right: 10px;}</style>
</head>
<body><h1>Real-time Stock Prices</h1><label for="stock-select">Choose a stock:</label><select id="stock-select"><option value="A">阿里</option><option value="B">百度</option><option value="T">腾讯</option></select><div id="data">Select a stock to see real-time data...</div><script>let currentStock = 'A';document.getElementById('stock-select').addEventListener('change', function() {currentStock = this.value;fetchData();  // 立即触发新股票的数据获取});async function fetchData() {try {const response = await fetch(`http://localhost:8000/poll/${currentStock}`);if (response.ok) {const result = await response.json();document.getElementById('data').innerText = `Stock: ${result.stock_name}, Price: $${result.price.toFixed(2)}, Change: ${result.change.toFixed(2)}`;} else if (response.status === 204) {document.getElementById('data').innerText = 'No new data';}} catch (error) {console.error('Error fetching data:', error);}setTimeout(fetchData, 1000);}fetchData();</script>
</body>
</html>

4. 代码解析

  1. 服务器端

    • stock_data:模拟股票行情数据,每10秒更新一次。
    • poll_stock:处理长轮询请求,检查是否有新数据可用,超时返回204状态码。
    • update_stock_data:异步任务模拟股票价格的变化。
  2. 客户端

    • 选择股票:用户通过 select 元素选择要查看的股票。
    • 长轮询请求fetchData 函数使用 fetch API 每秒发起一次请求,更新所选股票的实时数据。
    • 数据展示:获取到新数据后,更新 div 元素中的内容。

5. 启动服务器和测试

  1. 运行服务器代码:
    python app.py
    
  2. 打开HTML文件在浏览器中查看效果。

用户可以通过页面上的下拉菜单选择不同的股票,网页将通过长轮询机制每秒更新一次所选股票的实时行情数据。


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

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

http://www.ppmy.cn/devtools/94483.html

相关文章

1、Unity【基础】3D数学

3D数学 文章目录 3D数学1、数学计算公共类Mathf1、Mathf和Math2、区别3、Mathf中的常用方法&#xff08;一般计算一次&#xff09;4、Mathf中的常用方法&#xff08;一般不停计算&#xff09;练习 A物体跟随B物体移动 2、三角函数1、角度和弧度2、三角函数3、反三角函数练习 物…

zabbix agent 配置

zabbix agent 配置&#xff1a; 修改配置文件&#xff1a;/etc/zabbix/zabbix_agentd.conf Serverzabbix_server_IP ServerActivezabbix_server_IP Hostnameagent_hostname

VUE3请求意外报跨越错误或者500错误问题

1.有可能是请求传参和传参类型写错了 首先要确保该请求接口是支持跨域的&#xff08;不支持叫后端改&#xff09; access-control-allow-headers:Content-Type, Accept, Access-Control-Allow-Origin, api_key, Authorization access-control-allow-methods:GET, POST, OPTIO…

[log4cplus]: 快速搭建分布式日志系统

关键词: 日志系统 、日志分类、自动分文件夹、按时间(月/周/日/小时/分)轮替 一、引言 这里我默认看此文的我的朋友们都已经具备一定的基础,所以,我们本篇不打算讲关于log4cplus的基础内容,文中如果涉及到没有吃透的点,需要朋友们动动自己聪明的脑袋和发财的手指,进一…

ECCV2024,清华百度提出ReSyncer:可实现音频同步嘴唇动作视频生成。

清华&百度等联合提出了ReSyncer&#xff0c;可以实现更高稳定性和质量的口型同步&#xff0c;而且还支持创建虚拟表演者所必需的各种有趣属性&#xff0c;包括快速个性化微调、视频驱动的口型同步、说话风格的转换&#xff0c;甚至换脸。 ReSyncer的工作原理可以简单理解为…

Github 2024-08-14 C开源项目日报Top10

根据Github Trendings的统计,今日(2024-08-14统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目10Objective-C项目1PHP项目1Python项目1PHP:流行的Web开发脚本语言 创建周期:4710 天开发语言:C, PHP协议类型:OtherStar数量:37340 …

治理两个自动播放视频的应用:微信、浏览器

你的流量是否偷偷跑了&#xff1f; 首先&#xff0c;微信 发现页--在「搜一搜」界面点击右上角的「」&#xff0c;可以看到「搜一搜」的新增了「移动网络下视频自动播放」的开关。 关闭后&#xff0c;在手机连接移动网络的状态下&#xff0c;将不会再自动播放视频 此外&#…

LeetCode 热题 HOT 100 (023/100)【宇宙最简单版】

【技巧】No. 0647 回文子串【中等】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&#xff…