V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
huyudong1991
V2EX  ›  Python

本地 WEB 应用实时数据推送除了使用 websocket 还有其他选择吗

  •  
  •   huyudong1991 · 2020-12-01 18:55:56 +08:00 · 2870 次点击
    这是一个创建于 1437 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请教各位大佬一个头疼的问题,由于一些历史原因,我们公司做的测试系统是用 django 做的 web 程序,最近需要做数据实时监控,但是基于 channels 的 websocket 的数据推送延迟有 20ms,数据源的数据大概 10ms,所以推送不及时数据会堆积造成延迟,实际上浏览器和 django 都是本地运行的,想问下大佬们有没有什么途径可以避开 websocket

    17 条回复    2020-12-11 00:22:37 +08:00
    JeromeCui
        1
    JeromeCui  
       2020-12-01 19:24:20 +08:00
    为什么会有 20ms 的延迟?
    huyudong1991
        2
    huyudong1991  
    OP
       2020-12-01 19:33:31 +08:00
    实际测出来的调用时间,大概是 python 后端+tcp 连接的锅
    DoctorCat
        3
    DoctorCat  
       2020-12-01 19:47:38 +08:00
    感觉可能是 websocket 使用不当造成的。如果 ws 都不行,那么基于 HTTP 就没有更好的方法了。
    Austaras
        4
    Austaras  
       2020-12-01 19:52:42 +08:00
    server side event,这个麻烦
    webrtc,这个更麻烦
    轮询或者长链接,这个八成比 ws 延迟更高

    你试试看一次发多组数据呗反正人眼看不出几十毫秒的区别
    assiadamo
        5
    assiadamo  
       2020-12-01 19:56:33 +08:00
    webrtc 其实还好
    可不可以用一些比较轻量的队列呢?比如 mqtt
    thtznet
        6
    thtznet  
       2020-12-01 20:01:32 +08:00
    SignalR 了解一下
    huyudong1991
        7
    huyudong1991  
    OP
       2020-12-01 20:49:01 +08:00 via Android
    @thtznet 貌似兼容 ws,应该不会有本质区别吧
    huyudong1991
        8
    huyudong1991  
    OP
       2020-12-01 20:49:52 +08:00 via Android
    @DoctorCat 不太清楚原因,回头找个干净的环境正经测一下
    huyudong1991
        9
    huyudong1991  
    OP
       2020-12-01 20:50:13 +08:00 via Android
    @Austaras 现在确实是打算一次多发哈哈
    thtznet
        10
    thtznet  
       2020-12-01 21:04:29 +08:00
    @huyudong1991 SignalR 和 我们自己实现 webrtc 的核心区别就是,微软的工程师比大部分的"我们"牛,大牛封装过的东西,可能不是最顶级的,但下限是有保证的。毕竟大部分的“我们”只是普通的工程师,混口饭吃罢了。
    Bijiabo
        11
    Bijiabo  
       2020-12-01 21:36:25 +08:00 via iPhone
    我前两天也有类似的场景,间隔很巧也是 10ms 左右,看现象是浏览器接收 websocket 效率达不到这么高。特别是短时间内频繁操作。

    建议楼主写个浏览器外运行的脚本来收消息看下延迟,对比一下
    Austaras
        12
    Austaras  
       2020-12-01 23:05:33 +08:00
    不是,浏览器渲染一帧就要 1/60s,10 20ms 的延迟很关键吗?一般来说 100ms 一下的延迟是看都看不见的
    tairan2006
        13
    tairan2006  
       2020-12-02 00:02:39 +08:00 via Android
    10ms 不是应该考虑网速的影响么。。量级太低了
    ahsjs
        14
    ahsjs  
       2020-12-02 09:00:06 +08:00
    http2
    no1xsyzy
        15
    no1xsyzy  
       2020-12-02 10:22:03 +08:00
    让我理解下,数据流是这样的
    某上游 --> 你的 Django --> 用户浏览器
    上游发送数据每 10ms 发送一次
    用户浏览器每 20ms 接受一次(串行)
    从而导致消息在你的 Django 上积压

    那么结果很明显,方法有两个:
    1. 丢弃用户侧未能及时接受的数据
    2. 用户侧一次发送不止一份数据

    @Austaras 1/60s 不是 16ms 么?
    ardenchan
        16
    ardenchan  
       2020-12-02 11:28:08 +08:00
    根据楼上老哥的思路,服务器端给他睡眠个 10ms
    完美解决[手动狗头]
    anaf
        17
    anaf  
       2020-12-11 00:22:37 +08:00
    sse 单项通信
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5403 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 06:58 · PVG 14:58 · LAX 22:58 · JFK 01:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.