複数のマルチプロセスを備えたイベントレットであるフラスコソケットを操作する方法が正しいかどうかを知りたいです。
gstreamer でカメラ ストリームを処理する複数のプロセスがあり、各プロセスはフレームとメタデータを redis に書き込みます。
私のメイン プログラムは、socketio を使用してこのプロシージャを処理します。(開始、停止) し、redis からデータを取得し、ソケット経由で Web クライアントに送信します。
以下のコードは非常に縮小されていますが、私が何をしたかを示しています。一般的にコードは機能しますが、正しい方法で実行しているかどうかを確認したいと思います。さらに情報が必要な場合はお知らせください。
本当にありがとう
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)