I have a python flask application which can receive data from a json request and then process.
A sample of my code is as below: -
# Start with a basic flask app webpage.
from flask_socketio import SocketIO, emit
from flask import Flask, render_template, request, url_for, copy_current_request_context
from time import sleep
from threading import Thread, Event
__author__ = 'shark'
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
app.config['DEBUG'] = True
# turn the flask app into a socketio app
socketio = SocketIO(app, async_mode=None, logger=True, engineio_logger=True)
thread = Thread()
thread_stop_event = Event()
@app.route('/platform-data', methods=['POST'])
def platformData():
"""
Generate a random number every 1 second and emit to a socketio instance (broadcast)
Ideally to be run in a separate thread?
"""
# infinite loop of magical random numbers
print("Receiving platform data")
while not thread_stop_event.isSet():
req_data = request.get_json()
id = req_data['id']
latitude = req_data['coordinates'][1]
longitude = req_data['coordinates'][0]
speed = req_data['speed']
angle = req_data['angle']
length = req_data['dimensions'][0]
width = req_data['dimensions'][1]
laneW = req_data['lane_width']
spdLmt = req_data['speed_limit']
# return testProcess(speed)
# print(id, latitude, longitude, speed, angle, length, width, laneW, spdLmt)
def testProcess(id,speed):
if speed > 30:
print(id, " ", "slow down")
else:
print(id," ", "ok")
testProcess(id,speed)
# return {"speed": speed}
# socketio.emit('speed', {'speed': speed}, namespace='/test')
socketio.sleep(1)
@app.route('/')
def index():
# only by sending this page first will the client be connected to the socketio instance
return render_template('index.html')
@socketio.on('connect', namespace='/test')
def test_connect():
# need visibility of the global thread object
global thread
print('Client connected')
# Start the random number generator thread only if the thread has not been started before.
if not thread.isAlive():
print("Starting Thread")
thread = socketio.start_background_task(platformData)
@socketio.on('disconnect', namespace='/test')
def test_disconnect():
print('Client disconnected')
if __name__ == '__main__':
socketio.run(app)
I need to create this app in a way that it creates a separate thread for requests coming to it in realtime, based on the id of each request. The requests with the same id will be directed to the thread running that particular id.
My json request is as follows: -
{
"id" : "1"
"speed" : 20
}
I want to create a unique thread for each unique id in testProcess()
and provide output based on that id's speed. Currently, when I pass two different speeds for the same id, 2 separate threads are created. But I need to update the change in the same thread created uniquely for each unique id.
Any idea on how to do this?