使用flask socketio、具有多个多进程的eventlet的正确方法

问题描述

我想知道我是否以正确的方式使用flask socketio、具有多个多进程的eventlet。

我有多个进程来使用 gstreamer 处理相机流,每个进程将帧和元数据写入 redis

我的主程序使用 socketio 来处理这个过程。 (开始,停止) 并从 redis 获取数据,然后通过套接字将其发送到网络客户端。

下面的代码非常简化,但显示了我所做的。 通常代码有效,但我想确定我是否以正确的方式做。 如果需要更多信息,请告诉我。

非常感谢


app = Flask(__name__)
socket_io = SocketIO(app,cors_allowed_origins="*",async_mode='eventlet')

class DeviceProcess(mp.Process):

    def __init__(self,stop_event=None):
        super().__init__()
        self.stop_event = stop_event

    def run(self):
        """
            Worker 
        """
        while self.stop_event.is_set() == False:
            #do gstreamer stuff and store data to redis

class DeviceManager(object):

    def __init__(self):
        """
            Handles device proc's
        """
        self.device_procs = []
        self.pill2kill = multiprocessing.Event()

    def start(self):
        """
            Start all device procs
        """
        self.device_procs = []
        for device in self.recv_config.streams:
            s = DeviceProcess(
                stop_event=self.pill2kill
            )
            s.start()
            self.device_procs.append(s)
        
    def stop(self):
        """
            Stop all device proc's
        """
        self.pill2kill.set()

@socket_io.on('stream_details')
def stream_details(data):
    while True:
        """
           Getting data from redis and emit 
        """
        emit('data',{<redis_data>})
        # Stream with 25-FPS
        socket_io.sleep(1 / 25)

@socket_io.on('stop_devices')
def stop_devices():
    """
       Stop all devices procs via socket-oi
    """
    app.dm.stop_procs()
    emit('data',{'action': 'done'})

@socket_io.on('start_devices')
def start_devices():
    """
       Start all devices procs via socket-oi
    """
    app.dm.pill2kill.clear()
    app.dm.start()
    emit('data',{'action': 'done'})

if __name__ == '__main__':
    app.dm = Devicemanger()
    app.dm.start()
    socket_io.run(app)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)