我想知道如何使用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)