我正在通过客户端将服务器的最后返回传达给仪表板。客户端和仪表板都作为单独的进程运行,使用multiprocessing
。目前,我正在通过pipe()
传达收到的包裹。显示plotly dash
仪表板时,我使用的是间隔为 1 秒的@app.callback
。
这导致管道被挤得很紧,我的值被大大延迟地更新了。
仪表板代码
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
成功的修复 1
我没有运行multiprocessing.Pipe()
而是回退到使用multiprocessing.Value()
,这对于恒定的数据流似乎更稳定。 始终欢迎提出更有效的解决方案建议。