1

我想知道如何使用flask socketio、带有多个multiprocces的eventlet是否正确。

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

我的主程序使用 socketio 来处理这个过程。(启动,停止)并从 redis 获取数据,并通过套接字将其发送到 webclient。

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

非常感谢


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)
4

0 回答 0