Python Streamlit 应用程序通过 ZMQ 发送消息

问题描述

对 Streamlit 来说很新,但我正在尝试创建一个仪表板,该仪表板能够通过 ZMQ 将消息发送到充当订阅者的服务器应用程序。

import streamlit as st
import pandas as pd
import numpy as np
import altair as alt
import time
import zmq
class StreamLitManager(object):
    def __init__(self,log_file_path,zmq_port="88888"):
        self.log_file_path = log_file_path
        self.port = zmq_port
        self.context = None
        self.socket = None

    def InitConnections(self):
        self.context = zmq.Context()
        self.socket = self.context.socket(zmq.PUB)
        self.socket.bind("tcp://*:" + str(self.port))

        # Send Message


        # Close it right after using,this doesn't work as it doesn't close/terminate
        # I tried self.context.close() too,same situation
        self.context.term()

if __name__ == "__main__":
    submitted1 = st.form_submit_button('Submit 1')
    
    if submitted1:
        sm = StrategyManager(user_input)
        sm.InitConnections()

所以这个想法是每当用户按下提交 1 按钮时,我想发送一条消息。我遇到的问题是 ZMQError: Address in use。根据我对 streamlit 的肤浅理解,每当某些参数发生变化时,整个代码都会重新运行。当我不断为每个用户点击提交创建一个新的 ZMQ 发布者连接时,这似乎不太好。是我做错了什么还是有更好的设计模式我应该做。

谢谢

解决方法

PUB/SUB 在这里不是一个好的模式,它不断启动和停止,因为您可能会丢失消息。详情请见此处(py)zmq/PUB : Is it possible to call connect() then send() immediately and do not lose the message?