【问题标题】:Overfull multi-processing pipe() causing delays between socket client and dash client过多的多处理管道()导致套接字客户端和破折号客户端之间的延迟
【发布时间】:2020-06-16 12:40:55
【问题描述】:

我正在通过客户端将来自我的服务器的最后一次返回传送到仪表板。客户端和仪表板都使用multiprocessing 作为单独的进程运行。目前,我正在通过pipe() 传达收到的包裹。显示plotly dash-dashboard 时,我使用@app.callback,间隔为1 秒。

这会导致管道变得狭窄,并且我的值会延迟更新。

仪表板代码

def dashboard():
    app = dash.Dash()
    app.layout = html.Div([
        dcc.Interval(
            id="interval-components",
            interval=1*1000,
            n_intervals=0
        ),

        # dcc.Graph(figure=fig)
        daq.Gauge(
            id='gauge-chart',
            color={"gradient": True, "ranges": {
                "green": [0, 10], "yellow": [10, 30], "red": [30, 60]}},
            value=0,
            max=60,
            min=0,
            units="M/S",
        )
    ], className='row', style={'textAlign': 'center'})
    @app.callback(
        output=[Output('gauge-chart', 'value')],
        inputs=[Input('interval-components', 'n_intervals')]
    )
    def update_gauge(n):
        value = receive_packet(child_conn)[0][2]
        return [value]

    app.run_server(port=8047,debug=True)

def receive_packet(conn):
    packet = conn.recv()
    packet = list(map(int, packet))
    return [packet]

多处理

    parent_conn, child_conn = multiprocessing.Pipe()
    p1 = multiprocessing.Process(target=get_data, args=(parent_conn, address,))
    p2 = multiprocessing.Process(target=dashboard, args=())
    p3 = multiprocessing.Process(target=receive_packet, args=(child_conn, ))

    p1.start()
    p2.start()
    p3.start()

    p1.join()
    p2.join()
    p3.join()

get_data 发送到管道中

#SOME CODE TO RECEIVE THE PACKAGES FROM THE SERVER
while True:
   conn.send([can_id, an1, anVar, connected, time_since_valid])

有没有更好的方法在进程之间共享数据而不阻塞流?也许共享状态?

修复失败 1

我已经尝试通过让get_data 处理time.sleep(1) 来匹配间隔来修复它。这似乎不起作用。

修复失败 2

我尝试添加一些我准备好了消息,但这并不能解决问题:

def receive_packet(conn = child_conn):
    conn.send("GIMMI DATA")
    packet = conn.recv()
    conn.send("0")
    packet = list(map(int, packet))
    return [packet]


def get_data(conn = parent_conn):
    #################
    ####SOME CODE####
    #################
    packet = conn.recv()
    if packet == "GIMMI DATA":
        conn.send([can_id, an1, anVar, connected, time_since_valid])
    else:
        pass

【问题讨论】:

    标签: python python-3.x multiprocessing pipe plotly-dash


    【解决方案1】:

    成功修复 1

    我没有运行multiprocessing.Pipe(),而是使用multiprocessing.Value(),这对于恒定数据流来说似乎更稳定。 我们随时欢迎有关更有效解决方案的建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-29
      • 2017-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      相关资源
      最近更新 更多