Team Ai
Apppublic

PCNUSMSE/transcript_service

sourceHugging Faceapache-2.0updated 1mo agoView on Hugging Face
0likes
task_manager.cpython-310.pyc139 linesDownload Raw Back to __pycache__
1o

2E��ha@�@s2dZddlZddlZddlZddlmZmZddlmZmZddl	m3Z4ddlmZddl
mZmZmZmZmZddlmZd	d5lmZd	dlmZd	dlmZd	d
lmZd	dlmZGdd�de6�ZGdd�de7�Z eGdd�d��Z!eGdd�d��Z"eGdd�d��Z#Gdd�d�Z$da%de$fdd�Z&dS)uT任务管理模块8 9提供任务状态跟踪、进度管理和任务队列功能。10�N)�	dataclass�field)�datetime�	timedelta)�Enum)�Path)�Dict�List�Optional�Callable�Any)�ThreadPoolExecutor�)�11get_config)�get_task_logger)�get_file_validator)�get_oss_service)�get_paraformer_servicec@s,eZdZdZdZdZdZdZdZdZ	dZ12d	S)13�14TaskStatusu任务状态�pending�15validating�	uploading�transcribing�	completed�failed�	cancelledN)�__name__�16__module__�__qualname__�__doc__�PENDING�17VALIDATING�	UPLOADING�TRANSCRIBING�	COMPLETED�FAILED�	CANCELLED�r'r'�F/Users/chengpeng/MyProject/transcript_service/src/core/task_manager.pyrsrc@s eZdZdZdZdZdZdZdS)�TaskPriorityu任务优先级�r��N)rrrrZLOW�NORMALZHIGHZURGENTr'r'r'r(r)"sr)c@sfeZdZUdZdZeed<dZeed<dZ	eed<dZ18eed<d	Zeed19<ddededefdd
�Z
dS)�TaskProgressu任务进度信息��stager�current�d�total�message��20percentageNcCsT|dur||_|dur||_|dur||_|jdkr(td|j|jd�|_dSdS)u更新进度信息NrgY@r2)r1r3r4�minr6)�selfr1r3r4r'r'r(�update3s21�zTaskProgress.update)NNN)rrrrr0�str�__annotations__r1�intr3r4r6�floatr9r'r'r'r(r.*s22r.c@s�eZdZUdZdZeed<dZee	ed<dZ23eeed<ee
d�Zeeed<ee
d�Zeeed	<dZee	ed24<dZeed<d
e	fdd�ZdS)�25TaskResultu任务结果F�successN�data�
error_message��default_factory�processed_files�failed_files�transcription_resultsr5�duration�returncCs"|j|j|j|j|j|j|jd�S)�转换为字典格式�r?r@rArDrErFrGrJ�r8r'r'r(�to_dictKs�zTaskResult.to_dict)rrrrr?�boolr;r@r26rrAr:r�listrDr	rErFrGr=rLr'r'r'r(r>@s27r>c@s�eZdZUdZedd�d�Zeed<ej	Z28eed<ejZ
eed<eed�Zeeed<eed�Zeed	<eed�Zeed29<eejd�Zeed<dZeeed
<dZeeed<dZeeed<eed�Ze ee!fed<de fdd�Z"dS)�Tasku任务信息cCstt���dd�S)N�)r:�uuid�uuid4r'r'r'r(�<lambda>[�z
Task.<lambda>rB�id�status�priority�30file_paths�progress�result�31created_atN�32started_at�completed_at�callback�metadatarHcCs�|j|jj|jjt|j�dd�|jD�|jj|jj|jj	|jj33|jjd�|j�
�|jr0|j��nd|jr9|j��nd|jrB|j��nd|jd�S)rIcSsg|]}|j�qSr')�name)�.0�fpr'r'r(�34<listcomp>nsz Task.to_dict.<locals>.<listcomp>)r0r1r3r6r4N)rUrVrWZ35file_countZ36file_namesrYrZr[r\r]r_)rUrV�valuerW�lenrXrYr0r1r3r6r4rZrLr[�	isoformatr\r]r_rKr'r'r(rLgs"��zTask.to_dict)#rrrrrrUr:r;rr rVr)r-rWrNrXr	rr.rYr>rZr�nowr[r\r37r]r^r�dictr_rrrLr'r'r'r(rOXs38rOc@s4eZdZdZdd�Zdefdd�Zdefdd	�Ze	j39d40fdeede	d
e
fdd�Zde
d
eefdd�Zd
eefdd�Zded
eefdd�Zde
d
efdd�Zdd�Zdd�Zdd�Zdefd d!�Zded
efd"d#�Zdedeed
eefd$d%�Zded&ee
d
efd'd(�Zd/d*efd+d,�Zd
e fd-d.�Z!d41S)0�TaskManageru任务管理器cCspt�|_tdd�|_i|_tj|jjjd�|_	t42�|_t�|_
t�|_t|jjjd�|_g|_d|_|��dS)u初始化任务管理器ztranscript_service.task)�logger_name)�maxsize)Zmax_workersFN)r�configr�logger�tasks�asyncio�Queue�task�43queue_size�44task_queuer�file_validatorr�oss_servicer�paraformer_servicer
�app�concurrent_tasks�executor�status_callbacks�_processor_started�_start_task_processorrKr'r'r(�__init__�szTaskManager.__init__r^cCs|j�|�dS)ua添加状态变化回调函数45        46        Args:47            callback: 回调函数48        N)rz�append)r8r^r'r'r(�add_status_callback�szTaskManager.add_status_callbackrqcCsV|jD]%}z||�Wqty(}z|j�dt|����WYd}~qd}~wwdS)u通知状态变化u回调函数执行失败: N)rz�	Exceptionrm�errorr:)r8rqr^�er'r'r(�_notify_status_change�s49"���z!TaskManager._notify_status_changeNrXrWrHc�sf�|js|��t|||pid�}||j|j<|j�|j�IdH|j�d|j�dt	|����|jS)u�创建新任务50        51        Args:52            file_paths: 文件路径列表53            priority: 任务优先级54            metadata: 任务元数据55            56        Returns:57            任务ID58        )rXrWr_Nu创建任务: u, 文件数量: )59r{�_ensure_processor_startedrOrnrUrs�putrm�infore)r8rXrWr_rqr'r'r(�create_task�s��zTaskManager.create_task�task_idcCs|j�|�S)u�获取任务信息60        61        Args:62            task_id: 任务ID63            64        Returns:65            任务对象66        )rn�get)r8r�r'r'r(�get_task�s	zTaskManager.get_taskcCst|j���S)u获取所有任务)rNrn�valuesrKr'r'r(�
get_all_tasks�szTaskManager.get_all_tasksrVcs�fdd�|j��D�S)u根据状态获取任务csg|]	}|j�kr|�qSr'�rV)rarqr�r'r(rc�sz3TaskManager.get_tasks_by_status.<locals>.<listcomp>)rnr�)r8rVr'r�r(�get_tasks_by_status�szTaskManager.get_tasks_by_statusc�sh�|�|�}|s67dS|jtjtjtjfvrdStj|_t��|_d|j	_68|�|�|j�
d|���dS)u�取消任务69        70        Args:71            task_id: 任务ID72            73        Returns:74            是否成功取消75        Fu任务已取消u任务已取消: T)r�rVrr$r%r&rrgr]rYr4r�rmr�)r8r�rqr'r'r(�cancel_task�s�76	7778zTaskManager.cancel_taskcCsLz
t��}t�|���Wnty |j�d�d|_YdSwd|_dS)u启动任务处理器uB没有运行的事件循环,任务处理器将在需要时启动FTN)ro�get_running_loopr��_process_tasks�RuntimeErrorrm�debugr{�r8�loopr'r'r(r|�s�79z!TaskManager._start_task_processorcCsN|js%zt��}t�|���d|_WdSty$|j�d�YdSwdS)u确保任务处理器已启动Tu9无法启动任务处理器:没有运行的事件循环N)r{ror�r�r�r�rm�warningr�r'r'r(r�s��z%TaskManager._ensure_processor_startedc80�s��	z+|j��IdH}|�|�}|r|jtjkr|j��Wq|�|�IdH|j��Wn%tyR}z|j	�81dt|����t�
d�IdHWYd}~nd}~wwq)u处理任务队列TNu#处理任务队列时发生错误: r*)rsr�r�rVrr&�	task_done�
_execute_taskr�rm�	exceptionr:ro�sleep)r8r�rqr�r'r'r(r�82s �8384���zTaskManager._process_tasksc85�s���z@z�|j�|j�tj|_t��|_d|j	_86|j	�ddd�|�|�|�
|�IdH\}}|sUtj|_d|j_dd�|D�|j_t��|_|�|�WW|j��dStj|_d	|j	_87|j	�dt|�d88�|�|�|�||�IdH}dd�|D�}|s�tj|_d|j_t��|_|�|�WW|j��dStj|_d
|j	_89|j	�ddd�|�|�dd�|D�}|�||�IdH\}}}	t��|_|j|j��|j_|r�tj|_d|j_||j_dd�|D�|j_|j	�ddd�ntj|_|	|j_|�|�Wn4t�y2}90z'tj|_dt |91���|j_t��|_|j�!d|j���|�|�WYd}92~93n
d}94~95wwW|j��dSW|j��dS|j��w)uK执行任务96        97        Args:98            task: 任务对象99        u文件验证rr2u开始验证文件Nu没有有效的文件cSsg|]}t|d��qS�r)r:)ra�fr'r'r(rc3�z-TaskManager._execute_task.<locals>.<listcomp>u文件上传u开始上传文件到OSScS�g|]}|dr|�qS�r*r'�ra�rr'r'r(rc?r�u文件上传失败u语音转录u开始语音转录cS�g|]}|d�qS)rr'r�r'r'r(rcNrTTcSr�r�r'r�r'r'r(rcYrT�转录完成u任务执行失败: u执行任务时发生错误: )"rmZset_task_idrUrr!rVrrgr\rYr0r9r��_validate_filesr%rZrArEr]Z
clear_task_idr"re�
_upload_filesr#�_transcribe_audio�
total_secondsrGr$r?rFrDr�r:r�)r8rq�valid_files�
invalid_filesZupload_resultsZsuccessful_uploads�	file_urlsr?Ztranscription_resultr�r�r'r'r(r�sv�1001011021032�104105106"�107108109���	�zTaskManager._execute_taskc�st�|j�dt|j��d��|j�|j�\}}|j�dddt|��d��|j�dt|��dt|��d��||fS)	u验证文件u
开始验证 �110 个文件r2u验证完成: u 个有效文件u文件验证完成: u 个有效文件, u 个无效文件)rmr�rerXrtZvalidate_multiple_filesrYr9)r8rqr�r�r'r'r(r�js�"zTaskManager._validate_filesc	111�s��|j�dt|��d��g}t|�D]@\}}|jtjkrn5|j�||j	�IdH\}}}|�112|j|||f�|j�
|dt|�d|d�dt|��d��|�|�q|j�dtdd	�|D���d113��|S)u上传文件u
开始上传 r�Nr*u114已上传 �/u文件上传完成: cSr�r�r'r�r'r'r(rc�r�z-TaskManager._upload_files.<locals>.<listcomp>u115 个成功)rmr�re�	enumeraterVrr&ruZupload_filerUr~r`rYr9r�)	r8rqrX�results�i�	file_pathr?Zurl_or_error�116object_keyr'r'r(r�us�."zTaskManager._upload_filesr�c�s��|j�dt|��d��d}d|jvr"|jd}|j�d|���|j�||j|�IdH\}}}|rH|j�ddd�|j�dt|��d	��n	|j�	d117|���|||fS)u转录音频u
开始转录 u 个音频文件N�paraformer_paramsu!使用自定义Paraformer参数: r2r�u转录完成: r�u转录失败: )118rmr�rer_rvZbatch_process_with_retryrUrYr9r�)r8rqr�r�r?r�r�r'r'r(r��s�119120�121zTaskManager._transcribe_audio��hourscCs�t��t|d�}g}|j��D]\}}|jtjtjtj	fvr,|j122r,|j123|kr,|�|�q|D]}|j|=q/|j�
dt|��d��dS)ud清理已完成的任务124        125        Args:126            hours: 保留时间(小时)127        )r�u128清理了 u 个过期任务N)rrgrrn�itemsrVrr$r%r&r]r~rmr�re)r8r�Zcutoff_time�	to_remover�rqr'r'r(�cleanup_completed_tasks�s�129130�131z#TaskManager.cleanup_completed_taskscCs|t|j�t|�tj��t|�tj��t|�tj��t|�tj��t|�tj��t|�tj	��t|�tj132��|j��d�	}|S)u获取任务统计信息)	Ztotal_tasksrrrrrrrrr)
rernr�rr r!r"r#r$r%r&rs�qsize)r8�statsr'r'r(�get_statistics�s�zTaskManager.get_statistics)r�)"rrrrr}rrrOr�r)r-r	rr:r�r133r�r�rr�rMr�r|r�r�r��tupler�r�r�r<r�rr�r'r'r'r(ri~s&"
134LrirHcCstdurt�atS)uP获取任务管理器实例135    136    Returns:137        任务管理器实例138    N)�task_managerrir'r'r'r(�get_task_manager�sr�)'rro�timerQ�dataclassesrrrr�enumr�pathlibr�typingrr	r139rr�concurrent.futuresr
Zcore.configrZutils.loggerrZservices.file_validatorrZservices.oss_servicerZservices.paraformer_servicerrr)r.r>rOrir�r�r'r'r'r(�<module>s8%F