72 lines
2.9 KiB
Python
72 lines
2.9 KiB
Python
"""
|
||
Асинхронные сервисы для работы с отчетами
|
||
"""
|
||
import asyncio
|
||
import tempfile
|
||
import os
|
||
import logging
|
||
from concurrent.futures import ThreadPoolExecutor
|
||
from typing import Optional
|
||
|
||
from .services import ReportService
|
||
from .models import UploadRequest, UploadResult, DataRequest, DataResult
|
||
from .ports import StoragePort
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
|
||
class AsyncReportService:
|
||
"""Асинхронный сервис для работы с отчетами"""
|
||
|
||
def __init__(self, report_service: ReportService):
|
||
self.report_service = report_service
|
||
self.executor = ThreadPoolExecutor(max_workers=4)
|
||
|
||
async def upload_report_async(self, request: UploadRequest) -> UploadResult:
|
||
"""Асинхронная загрузка отчета"""
|
||
try:
|
||
# Запускаем синхронную обработку в отдельном потоке
|
||
loop = asyncio.get_event_loop()
|
||
result = await loop.run_in_executor(
|
||
self.executor,
|
||
self._process_upload_sync,
|
||
request
|
||
)
|
||
return result
|
||
except Exception as e:
|
||
logger.error(f"Ошибка при асинхронной загрузке отчета: {str(e)}")
|
||
return UploadResult(
|
||
success=False,
|
||
message=f"Ошибка при асинхронной загрузке отчета: {str(e)}"
|
||
)
|
||
|
||
def _process_upload_sync(self, request: UploadRequest) -> UploadResult:
|
||
"""Синхронная обработка загрузки (выполняется в отдельном потоке)"""
|
||
return self.report_service.upload_report(request)
|
||
|
||
async def get_data_async(self, request: DataRequest) -> DataResult:
|
||
"""Асинхронное получение данных"""
|
||
try:
|
||
# Запускаем синхронную обработку в отдельном потоке
|
||
loop = asyncio.get_event_loop()
|
||
result = await loop.run_in_executor(
|
||
self.executor,
|
||
self._process_get_data_sync,
|
||
request
|
||
)
|
||
return result
|
||
except Exception as e:
|
||
logger.error(f"Ошибка при асинхронном получении данных: {str(e)}")
|
||
return DataResult(
|
||
success=False,
|
||
message=f"Ошибка при асинхронном получении данных: {str(e)}"
|
||
)
|
||
|
||
def _process_get_data_sync(self, request: DataRequest) -> DataResult:
|
||
"""Синхронное получение данных (выполняется в отдельном потоке)"""
|
||
return self.report_service.get_data(request)
|
||
|
||
def __del__(self):
|
||
"""Очистка ресурсов"""
|
||
if hasattr(self, 'executor'):
|
||
self.executor.shutdown(wait=False) |