Фоновый поток неожиданно и бесшумно останавливается при очистке пакетов в приложении Flask.Python

Программы на Python
Anonymous
Фоновый поток неожиданно и бесшумно останавливается при очистке пакетов в приложении Flask.

Сообщение Anonymous »

Вопрос:
Я работаю над приложением Flask, в котором мне нужно периодически очищать устаревшие пакеты в базе данных. Чтобы избежать ненужной обработки, я создал фоновый поток, который проверяет наличие неактивных пакетов и удаляет их, если они не получили никаких данных. Фоновый поток запускается, когда веб-сайт получает запрос, и останавливается, если в течение 10 минут нет активности.
Однако фоновый поток закрывается неожиданно и тихо, без каких-либо ошибок, и я не могу понять почему. Кажется, что поток завершается, но нет никаких исключений или журналов, которые бы указывали, что происходит не так.
Вот упрощенная версия моего кода:
Код:

Код: Выделить всё

import threading
from time import sleep
from datetime import datetime, timedelta
from flask import Flask, request
from sqlalchemy import text

app = Flask(__name__)

last_request_time = None
background_task_running = False
task_lock = threading.Lock()

# Function to update last request time on each user request
def update_last_request_time():
global last_request_time
last_request_time = datetime.utcnow()

# Function to start the background task, ensuring it only runs when necessary
def start_background_task():
global background_task_running
with task_lock:
if not background_task_running:
try:
print("Starting background task")
background_thread = threading.Thread(target=check_for_inactive_batches)
background_thread.daemon = True  # Daemon thread will stop with the app
background_thread.start()
background_task_running = True
except Exception as e:
print(f"Error Starting background task: {e}")

# Function to stop the background task
def stop_background_task():
global background_task_running
with task_lock:
if background_task_running:
print("Stopping background task")
background_task_running = False

# Background task to check for inactive batches and delete them if necessary
def check_for_inactive_batches():
global background_task_running
engine = db_connection()  # Database connection setup
while background_task_running:
if last_request_time and (datetime.utcnow() - last_request_time).total_seconds() > 600:
stop_background_task()
print("No requests for 10 minutes, stopping background task.")
break

current_time = datetime.utcnow()
with engine.connect() as conn:
try:
delete_query = text("""
DELETE FROM TB_BATCHES
WHERE LastHeartbeat < :threshold_time
AND Status = 'scanning' OR Status = 'uploading'
""")
threshold_time = current_time - timedelta(seconds=70)
conn.execute(delete_query, {'threshold_time': threshold_time})
conn.commit()
print(f"Checked and deleted inactive batches at {current_time}")
except Exception as e:
print(f"Error deleting inactive batches: {e}")

sleep(60)  # Check every 60 seconds

# Flask @before_request hook to update user activity and start the background task if necessary
@app.before_request
def track_user_activity():
if request.endpoint == 'get_batches':
return  # Skip cleanup logic for this route as receiving periodic calls

update_last_request_time()
start_background_task()

Окружающая среда:
  • Версия Python: 3.11.3
  • Flask 2.3 .2
WSGI:
  • официантка WSGI
Что я пробовал:
  • Ведение журнала: я добавил print, но они не отображают никаких ошибок или исключений до остановки потока. Журнал просто останавливается без дальнейшего вывода при «Запуске фоновой задачи».
  • Thread Daemon: я создал поток демон, чтобы он останавливался при остановке приложения, но, похоже, это не связано с проблемой.
  • Ошибки SQLAlchemy< /strong>: я включил блоки try/Exception в запросы к базе данных, но ошибок не обнаружено.
  • Проверено использование ресурсов< /strong>: При возникновении этой проблемы не наблюдается каких-либо значительных скачков использования памяти или ЦП.
Ожидаемое поведение:
Фоновый поток должен продолжать работать до тех пор, пока приложение не получит никаких запросов в течение 10 минут, и не запустится снова после нового запроса, и он не должен завершаться автоматически. без завершения процесса очистки.

Фактическое поведение:
Фоновый поток останавливается без каких-либо ошибок или вывода журнала. Последний Я получаю вывод: «Запуск фоновой задачи», и я не могу определить, почему фактический запрос не выполняется.

Подробнее здесь: https://stackoverflow.com/questions/789 ... ches-in-fl

Вернуться в «Python»