Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
383 views
in Technique[技术] by (71.8m points)

python - Correct way to use flask socketio, eventlet with multiple multiprocces

I want to know if am going the right way how to work with flask socketio, eventlet with multiple multiprocces.

I have multiple procces to handle camera streams with gstreamer, each proc write frames and meta data to redis.

My main programm use socketio to handle this procs. (start, stop) and getting data from the redis, and send it over sockets to a webclient.

Code below are very reduced but show what i did. In generally code works, but i want to get sure if I do it the right way. Please let me know if more Information needed.

Big thanks


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)
question from:https://stackoverflow.com/questions/65641685/correct-way-to-use-flask-socketio-eventlet-with-multiple-multiprocces

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)
Waitting for answers

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...