39 lines
1.6 KiB
Python
39 lines
1.6 KiB
Python
"""
|
|
classify_worker.py — Фоновый процесс классификации (Фаза async classify).
|
|
|
|
Запускается через subprocess.Popen из convert_server.py.
|
|
Принимает batch_id как аргумент командной строки.
|
|
Не зависит от HTTP-сервера — свои коннекты к БД, своя память.
|
|
|
|
ЗАЧЕМ: threading.Thread внутри HTTP-процесса делит коннекты к БД
|
|
с HTTP-потоком. При 50+ файлах ThreadPoolExecutor(4) + HTTP-поток
|
|
исчерпывают пул коннектов → сервер не отвечает → 502.
|
|
|
|
subprocess.Popen создаёт отдельный питон-процесс со своей памятью
|
|
и своими коннектами. HTTP-сервер продолжает отвечать на batch-progress.
|
|
Процесс живёт пока classify не завершится, потом умирает.
|
|
"""
|
|
|
|
import sys, os
|
|
sys.path.insert(0, os.path.dirname(__file__))
|
|
|
|
from compare.classify import classify_batch
|
|
|
|
if __name__ == "__main__":
|
|
if len(sys.argv) < 2:
|
|
print("Usage: python3 classify_worker.py <batch_id>", file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
batch_id = sys.argv[1]
|
|
lock_path = f"/tmp/classify_{batch_id}.lock"
|
|
try:
|
|
result = classify_batch(batch_id)
|
|
print(f"classify_worker DONE: {result}")
|
|
except Exception as e:
|
|
print(f"classify_worker FAILED: {e}", file=sys.stderr)
|
|
sys.exit(1)
|
|
finally:
|
|
# Убрать lock-файл в любом случае
|
|
if os.path.exists(lock_path):
|
|
os.remove(lock_path)
|