Das Problem besteht darin, dass ich beim Erstellen der App Variablen im gesamten Servercode gemeinsam nutzen musste, also habe ich globale Variablen verwendet. Ich habe kürzlich herausgefunden, dass dies eine äußerst schlechte Vorgehensweise ist und mein Programm im Grunde genommen unbrauchbar machen würde, wenn es mehrere Endbenutzer gibt. Ich frage mich, ob es eine Möglichkeit gibt, mein Problem zu beheben, ohne das gesamte Programm komplett zu überarbeiten? Ich habe mir die Verwendung von „g“ und „session“ angesehen. Wenn ich das richtig verstehe (und es ist sehr wahrscheinlich, dass ich es nicht verstehe), wird „g“ jedes Mal zurückgesetzt, wenn der Server vom Frontend aus angegriffen wird, was alle 2 Sekunden geschieht. Dies wäre natürlich schlecht, wenn man bedenkt, dass die Ergebnisse derzeit lokal gespeichert werden und nicht bei jeder Serverabfrage zurückgesetzt werden sollten. Der Endpunkt, der ständig erreicht wird, ist jedoch „get_progress“, daher bin ich mir nicht sicher, ob die Daten dadurch tatsächlich gelöscht werden oder nicht. Ich verlange definitiv nicht, dass mein Code einfach nur korrigiert wird, aber wenn jemand irgendwelche Hinweise hat, wäre ich sehr dankbar.
Ich habe auch Threading verwendet, was meiner Meinung nach das gleiche Problem hat. Ich suche derzeit nach Sellery, um dieses Problem zu umgehen, da die Verwendung von Threads die Laufzeit erheblich verkürzt.
Hier ist der Servercode:
PS: Ich weiß, dass es hier wahrscheinlich viele schlechte Praktiken gibt, aber im Moment konzentriere ich mich wirklich auf die Lösung dieses speziellen Problems, daher wäre ich für jede Hilfe sehr dankbar. Ich habe auch einen Großteil des Codes entfernt, um den Beitrag nicht zu überfüllen.
Code: Select all
app = Flask(__name__)
# Global variables for results and progress
results = []
progress = {"total_files": 0, "files_processed": 0}
def process_files(data):
"""Background function to process files."""
global results, progress
bucket_name = "noaa-jpss"
prefix = f"NOAA20/SOUNDINGS/NOAA20_NUCAPS-CCR/{data['year']}/{str(data['month']).zfill(2)}/{str(data['day']).zfill(2)}/"
client_s3 = boto3.client("s3", config=Config(signature_version=UNSIGNED))
file_keys = list_all_files(bucket_name, prefix, client_s3)
if not file_keys:
progress["status"] = "no_files"
progress["running"] = False
return
progress["status"] = "in_progress"
progress["total_files"] = len(file_keys)
progress["files_processed"] = 0
progress["stop_requested"] = False
for key in file_keys:
if progress["stop_requested"]: # Check if stop is requested
progress["status"] = "stopped"
progress["running"] = False
return
dataset = open_s3_dataset(bucket_name, key, client_s3)
filtered = filter_data(dataset, lat_min=data['lat_min'], lat_max=data['lat_max'], long_min=data['long_min'], long_max=data['long_max'])
if filtered:
if not any(result["file"] == key for result in results): # Avoid duplicates
results.append({"file": key, **filtered})
progress["files_processed"] += 1
progress["status"] = "completed"
progress["running"] = False
@app.route("/")
def index():
"""Render the main page."""
return render_template("index.html")
@app.route("/start_query", methods=["POST"])
def start_query():
"""Start processing files."""
global results, progress
# Check if a process is already running
if progress.get("running", False):
return jsonify({"message": "Processing is already running. Please wait for it to complete."}), 400
# Reset progress and results for a new query
results.clear()
progress = {"total_files": 0, "files_processed": 0, "status": "not_started", "running": True, "found_file": False, "bucket": None}
data = request.json
progress["bucket"] = data["Datasets"]
if(data['Datasets']=='aresol_depth'):
thread = threading.Thread(target=find_aresol_file, args=(data,))
thread.start()
print('looking for aresol data')
elif(data['Datasets']=='cris_radiances'):
# Start the file processing in a separate thread
thread = threading.Thread(target=process_files, args=(data,))
thread.start()
return jsonify({"message": "Processing started"})
@app.route("/stop_query", methods=["POST"])
def stop_query():
"""Stop the current query without clearing results."""
global progress
if progress.get("running", False):
progress["stop_requested"] = True # Signal to stop processing
progress["status"] = "stopped" # Update the status
progress["found_file"] == False
return jsonify({"message": "Query stopping..."}), 200
else:
return jsonify({"message": "No query is currently running."}), 400
@app.route("/get_progress", methods=["GET"])
def get_progress():
"""Get the current progress and results."""
return jsonify({"progress": progress, "results": results})
if __name__ == "__main__":
app.run(port=8000, debug=True)