在websockets中使用Dash

vybvopom  于 2023-04-30  发布在  其他
关注(0)|答案(3)|浏览(153)

使用达世币和Websockets构建实时 Jmeter 板的最佳方式是什么?我想在每次收到消息时更新一个图,但我发现的唯一一件事是每隔x秒调用一次回调,如下面的示例。

import dash
import dash_core_components as dcc
import dash_html_components as html
import dash_daq as daq
from dash.dependencies import Input, Output
import plotly
import plotly.graph_objs as go
from websocket import create_connection
from tinydb import TinyDB, Query
import json
import ssl

# Setting up the websocket and the necessary web handles
ws = create_connection(address, sslopt={"cert_reqs": ssl.CERT_NONE})

app = dash.Dash(__name__)
app.layout = html.Div(
    [
        dcc.Graph(id='live-graph', animate=True),
        dcc.Interval(
            id='graph-update',
            interval=1*1000,
            n_intervals=0)
    ]
)

@app.callback(Output('live-graph', 'figure'),
              [Input('graph-update', 'n_intervals')])

def update_graph_live(n):

    message = ws.recv()
    x=message.get('data1')
    y=message.get('data2')
        .....

    fig = go.Figure(
        data = [go.Bar(x=x,y=y)],
        layout=go.Layout(
            title=go.layout.Title(text="Bar Chart")
            )
        )
    )

    return fig

if __name__ == '__main__':
    app.run_server(debug=True)

有没有一种方法可以在每次接收到消息时触发回调(也许之前将它们存储在数据库中)?

bejyjqdl

bejyjqdl1#

这篇论坛文章描述了一种在Dash中使用WebSocket回调的方法:
https://community.plot.ly/t/triggering-callback-from-within-python/23321/6

更新

试过了,效果很好。环境是Windows 10 x64 + Python 3。7.
要进行测试,请下载.tar.gz文件并运行python usage.py。它会抱怨一些丢失的软件包,安装这些。可能需要在usage.py中将地址从0.0.0.0编辑为127.0.0.1。浏览到http://127.0.0.1:5000以查看结果。如果我有更多的时间,我会把这个例子放在GitHub上(如果你在让它工作时遇到麻烦,或者原始文件丢失,请ping我)。

fjnneemd

fjnneemd2#

您可以查看Dash Extensions包中的Websocket组件。正如您在example中看到的,该包提供了一个WebSocket组件,该组件包含在您的应用布局中。消息可以通过WebSocketmessage属性在回调中接收。
关于这一点,您的问题的解决方案如下所示:

from dash_extensions import WebSocket
from dash_extensions.enrich import callback, dcc, html, Input, Output, DashProxy
# all dash imports are replaced by dash_extensions
import plotly.graph_objs as go

app = DashProxy(__name__)
app.layout = html.Div(
    [
        dcc.Graph(id='live-graph', animate=True),
        WebSocket(id='ws', url="ws:...")  # Websocket address is inserted here
    ]
)

@callback(Output('live-graph', 'figure'),
          Input('ws', 'message'))
def update_graph_live(msg):
    # Parsing msg depends on its structure, e.g.:
    x = msg['x']
    y = msg['y']

    fig = go.Figure(
        data=[go.Bar(x=x,y=y)],
        layout=go.Layout(
            title=go.layout.Title(text="Bar Chart")
        )
    )
    return fig

上面的链接提供了关于这个主题的进一步细节,e.例如,关于WebSocket设置。

4xrmg8kj

4xrmg8kj3#

我有两个独立的服务器:一个用于Dash,另一个作为套接字服务器。它们在不同的端口上运行。收到消息后,我编辑了一个通用的json文件,以便将信息共享给dash的回调。我就是这么做的

相关问题