跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • Flask-SocketIO 多线程遇到的问题
未分類
12 4 月 2021

Flask-SocketIO 多线程遇到的问题

Flask-SocketIO 多线程遇到的问题

資深大佬 : Alexf4 0

最近在使用 Flask-SocketIO 想实现实时跟踪 celery 的任务日志(每个任务一个日志文件)的功能。 在本地运行,开了两个窗口,第二个窗口会输出自己的日志,第一个窗口会输入自己的加后一个窗口的日志。类似后续每开的一个窗口,前面的窗口都会 append 此窗口的日志。

client

import sys  import socketio   client = socketio.Client(reconnection=False)   @client.on('log', namespace='/cdc') def on_log(args):     print(args['data'])   def send(log_path):     try:         client.connect('http://127.0.0.1:5000', namespaces='/cdc')         client.emit('log', {'log_path': log_path}, namespace='/cdc')     except KeyboardInterrupt:         try:             sys.exit(0)         except SystemExit:             sys.exit(1) 

server

sio = flask_socketio.SocketIO(async_mode=async_mode)   @sio.on('log', namespace='/cdc') def log(data):     thread = sio.start_background_task(scan_log, data['log_path'], None, flask.request.sid)   def scan_log(log_path, app=None, client_id=None):     counter = 0      with open(log_path, 'r') as f:         while True:             line = f.readline()             if not line:                 sio.sleep(0.1)                 continue             counter += 1             sio.emit('log', {'data': line.strip()}, namespace='/cdc', to=client_id) 

各位有没有遇到类似的情况?或者有什么大概的思路?

大佬有話說 (5)

  • 資深大佬 : dassh

    每个日志应该有一个独立的标识,然后 on_log 里对标识进行判断,如果是对应的才 print

  • 主 資深大佬 : Alexf4

    @dassh 这里每一个日志都是独立的(每个任务都生成对应的日志)
    所以 client on log 会接受 server 多个线程分别 emit 的数据?
    我这个 scan log 不是用多个线程进行的么,另外 emit 的时候用 to 这个参数也区别了 client 的发送的呀

  • 資深大佬 : dassh

    sio.on(‘log’, …)就表示你订阅了所有 server emit 的’log’的事件,所以你需要进行过滤判断,to 参数我没用过哈,给你一种解决方案
    “`

    @client.on(‘log’, namespace=’/cdc’)
    def on_log(args):
    if args[‘log_path’] == sys.argv[1] #这里的 sys.argv[1]就是你传入 log_path 的地址
    print(args[‘data’])

    def scan_log(log_path, app=None, client_id=None):
    …
    sio.emit(‘log’, {‘data’: line.strip(), ‘log_path’: log_path}, namespace=’/cdc’, to=client_id)

    “`

  • 資深大佬 : Latin

    同一加 uuid 过滤

  • 主 資深大佬 : Alexf4

    @dassh 感谢你的思路~
    – to 的参数我测试了下, 在不调用 `start_background_task ` 的情况下,可以完成独立 print 功能
    – 在调用 `start_background_task ` 才会出现提到的,旧的窗口也会获取到新窗口的数据(日志数据)
    – 所以是比较想好奇这一块的实现方式或者原理

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具