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
kayseen
V2EX  ›  Python

关于使用 websocket 定时推送的疑惑

  •  
  •   kayseen · 2019-12-20 10:18:22 +08:00 · 4983 次点击
    这是一个创建于 1561 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如要实现一个后端向前端定时推送数据的业务,每五分钟推送一次,连接的对象为每个用户(可以获取每个连接对象的 sid),推送的数据为每个用户 5 分钟内的账户余额,当然这只是模拟一个使用场景
    
    1.每个用户连接之后,会有唯一的 sid,然后把该 sid 最为 room 标识来实现 1v1 推送,但是定时每 5 分钟推送一次,是不是每个用户连接都开启一个线程,然后在每个线程里开启 sleep?
    
    2. 这种使用场景,是服务端 sleep 好还是前端定时向服务端请求数据好呢?
    
    
    16 条回复    2019-12-25 12:50:16 +08:00
    xnode
        1
    xnode  
       2019-12-20 10:33:51 +08:00
    1 我觉得不合适 不推送不等于 sleep 吧
    2 前端向后端请求逻辑能清楚
    065535
        2
    065535  
       2019-12-20 10:35:25 +08:00
    一般客户端要定时收到消息有两种方式:
    客户端定时主动拉取服务端数据,也就是客户端 sleep,然后拉取接口信息,这种的实时度要看定时的频率。
    客户端服务端保持一个长连接,由客户端发起数据推送的请求,达到实时推送的效果。

    建议使用“个推”、“极光推送”等这种推送服务。
    klesh
        3
    klesh  
       2019-12-20 10:36:41 +08:00 via Android   ❤️ 1
    这么有规律的话,直接定时请示就好了
    kayseen
        4
    kayseen  
    OP
       2019-12-20 10:36:47 +08:00
    @xnode
    @065535
    好滴,清楚了,感谢哈~
    kayseen
        5
    kayseen  
    OP
       2019-12-20 10:37:05 +08:00
    @klesh
    了解了,嘿嘿
    wysnylc
        6
    wysnylc  
       2019-12-20 10:38:30 +08:00
    5 分钟一次还不如写个接口让前端拉
    websocket 等你需要实时更新数据再说,前期先用 http 轮询顶着
    robot1
        7
    robot1  
       2019-12-20 11:10:04 +08:00
    每个用户开一个线程?? 2 千用户开 2000 个线程? python 随便一个异步 io 框架单线程定时推送 1 万用户轻轻松松
    Leigg
        8
    Leigg  
       2019-12-20 11:47:23 +08:00 via Android
    使用 ws 的场景: 单用户请求频繁(秒级别,如每秒一次),要求时延低(如弹幕),你看看你需求符合哪个?
    你的这个需求直接在前端轮询是最简单最合理的方式。
    lihongjie0209
        9
    lihongjie0209  
       2019-12-20 11:49:58 +08:00
    @robot1 #7 用不着, 一个简单的线程池就可以了
    xmge
        10
    xmge  
       2019-12-20 11:56:22 +08:00
    如果不是经常更新的数据。

    感觉 [定时拉去] 和 [定时推送] 都浪费性能。

    最好是,如果后台数据有变化再通知前端。

    长轮循 /socket/mqtt 都可以做到。


    如果是经常更新的数据

    感觉直接前端定时拉去更简单一点。直接走 http 就完事了。简单,方便,不易出错。
    robot1
        11
    robot1  
       2019-12-20 12:03:49 +08:00
    @lihongjie0209 他这描述不详细 如没有 cpu 密集单线程就满足了
    ClericPy
        12
    ClericPy  
       2019-12-20 12:37:08 +08:00
    点进来以前以为会聊 H5 那个 SSE...
    locoz
        13
    locoz  
       2019-12-20 16:07:23 +08:00
    实时性要求不高的东西...直接前端轮询吧
    dark3212
        14
    dark3212  
       2019-12-20 16:16:02 +08:00
    不是严格意义上的 5 分钟的话,可以起一个定时任务,5 分钟一次,循环给所有连接的客户端连接发送余额。
    doublechenpaul
        15
    doublechenpaul  
       2019-12-20 16:35:08 +08:00
    感觉后端定时任务会好点
    CzaOrz
        16
    CzaOrz  
       2019-12-25 12:50:16 +08:00
    服务端 sleep 也可以,而且只需要 sleep 一次就够了
    可以参考 aHR0cHM6Ly9naXRodWIuY29tL0N6YU9yei9QeXdzcwo= 里面的广播中间件( base64 )
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2855 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 11:41 · PVG 19:41 · LAX 04:41 · JFK 07:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.