o
    i#'                     @  s   d dl mZ d dlZd dlZd dlmZmZ d dlmZ d dl	m
Z
mZ ddlmZ ddlmZmZmZmZ dd	lmZ dd
lmZ ddlmZ ddlmZmZmZ ddlmZ ed Zeee   dZ!G dd dej"e Z#dS )    )annotationsN)	AwaitableCallable)BaseContext)AnyLiteral   )utils)
JobContextJobExecutorType
JobProcessRunningJobInfologger)aio)get_cpu_monitor   )inference_executorjob_proc_executorjob_thread_executor)JobExecutor)process_createdprocess_startedprocess_readyprocess_closedprocess_job_launched   c                      s   e Zd Zd9 fddZed:ddZd;d"d#Zd<d$d%Zd<d&d'Zd=d*d+Z	d>d,d-Z
ed?d.d/Zejed0d<d1d2Zejed0d@d5d6Zejed0d<d7d8Z  ZS )AProcPoolinitialize_process_fncCallable[[JobProcess], Any]job_entrypoint_fnc'Callable[[JobContext], Awaitable[None]]session_end_fnc.Callable[[JobContext], Awaitable[None]] | Nonenum_idle_processesintinitialize_timeoutfloatclose_timeoutr   +inference_executor.InferenceExecutor | Nonejob_executor_typer   mp_ctxr   memory_warn_mbmemory_limit_mb
http_proxy
str | Noneloopasyncio.AbstractEventLoopreturnNonec                  s   t    || _|	| _|| _|| _|| _|| _|| _|| _	|| _
|| _|
| _|| _|| _|| _tt| _tjt  | _g | _t | _t | _t | _d| _d| _t | _d| _ d S )NFr   )!super__init___job_executor_type_mp_ctx_initialize_process_fnc_job_entrypoint_fnc_session_end_fnc_close_timeout_inf_executor_initialize_timeout_loop_memory_limit_mb_memory_warn_mb_default_num_idle_processes_http_proxy_target_idle_processesasyncio	SemaphoreMAX_CONCURRENT_INITIALIZATIONS	_init_semQueuer   _warmed_proc_queue
_executorsset_spawn_tasks_close_tasks_monitor_tasks_started_closedEvent_idle_ready_jobs_waiting_for_process)selfr   r    r"   r$   r&   r(   r   r*   r+   r,   r-   r.   r0   	__class__ ^/var/www/html/livekit_bhavya/venv/lib/python3.10/site-packages/livekit/agents/ipc/proc_pool.pyr5      s2   


zProcPool.__init__list[JobExecutor]c                 C     | j S N)rJ   rT   rW   rW   rX   	processesJ      zProcPool.processesjob_idstrJobExecutor | Nonec                   s   t  fdd| jD d S )Nc                 3  s(    | ]}|j r|j jj kr|V  qd S r[   )running_jobjobid).0xr_   rW   rX   	<genexpr>P   s   & z)ProcPool.get_by_job_id.<locals>.<genexpr>)nextrJ   )rT   r_   rW   rg   rX   get_by_job_idN   s   zProcPool.get_by_job_idc                   sx   | j rd S d| _ t|  | _| jdkr:ztj| j | j	d dI d H  W d S  tj
y9   td Y d S w d S )NTr   r   )timeoutz2timed out waiting for idle processes to initialize)rO   rD   create_task
_main_task_main_ataskrA   wait_forrR   waitr=   TimeoutErrorr   warningr\   rW   rW   rX   startT   s   
zProcPool.startc                   s(   | j sd S d| _t| jI d H  d S )NT)rO   rP   r   cancel_and_waitrn   r\   rW   rW   rX   aclosef   s
   zProcPool.acloseinfor   c              
     s\  d}t |D ]}|  jd7  _zB| j r2t| j| jk r2t|  }| j	| |
| jj | j rBtjdd|jjid | j I d H }W |  jd8  _n|  jd8  _w z||I d H  | d| W  d S  ty   t| }| j	| |
| jj ||d krtjd|d|jjid  tjd|jj|d d	d Y qw d S )
N   r   zBno warmed process available for job, waiting for one to be createdr_   extrar   z1failed to launch job on process after %d attemptsz<failed to launch job on process, retrying with a new process)r_   attempt)rangerS   rI   emptylenrL   rD   rl   _proc_spawn_taskaddadd_done_callbackdiscardr   rr   rc   rd   get
launch_jobemit	Exceptionru   rM   error)rT   rv   MAX_ATTEMPTSrz   taskproc
close_taskrW   rW   rX   r   m   sN   

 

zProcPool.launch_jobc                 C  s
   || _ d S r[   rC   )rT   r$   rW   rW   rX   set_target_idle_processes   s   
z"ProcPool.set_target_idle_processesc                 C  rZ   r[   r   r\   rW   rW   rX   target_idle_processes   r^   zProcPool.target_idle_processesr   c                   s  | j tjkrtj| j| j| j| j| j	| j
dd| j| jd
}n-| j tjkrDtj| j| j| j| j| j	| j
| j| jddd| j| j| jd}ntd| j  | j| d}zW| j4 I d H C | js| d| | I d H  | d	| | I d H  | d
| | j| | j | jkr| j   d}W d   I d H  n1 I d H sw   Y  W n t!y   t"j#d|$ d Y n
 t%j&y   Y nw |s| j'| |( I d H  | d| d S t%)| *|}| j+,| |-| j+j. d S )Ng      @g      ?)
r   r    r"   r&   r(   r   ping_intervalhigh_ping_thresholdr.   r0   <   )r   r    r"   r&   r(   r   r+   r0   r   ping_timeoutr   r,   r-   r.   zunsupported job executor: Fr   r   r   Tzerror initializing processrx   r   )/r6   r   THREADr   ThreadJobExecutorr8   r9   r:   r=   r;   r<   rB   r>   PROCESSr   ProcJobExecutorr7   r@   r?   
ValueErrorrJ   appendrG   rP   r   rs   
initializerI   
put_nowaitqsizerA   rR   rK   r   r   	exceptionlogging_extrarD   CancelledErrorremoveru   rl   _monitor_process_taskrN   r   r   r   )rT   r   initializedmonitor_taskrW   rW   rX   r~      sz   
(zProcPool._proc_spawn_taskr   r   c              	     s>   z|  I d H  | d| W | j| d S | j| w )Nr   )joinr   rJ   r   )rT   r   rW   rW   rX   r      s
   zProcPool._monitor_process_taskc                   s   zH| j sG| j t| j }tt| j| j| j	}|| }t
|D ]}t|  }| j| || jj q"tdI d H  | j rW d S W d S  tjy}   tj| j I d H  tjdd | jD  I d H  tj| j I d H  tj| j I d H  Y d S w )Ng?c                 S  s   g | ]}|  qS rW   )ru   )re   r   rW   rW   rX   
<listcomp>   s    z'ProcPool._main_task.<locals>.<listcomp>)rP   rI   r   r}   rL   maxminrC   rA   rS   r{   rD   rl   r~   r   r   r   sleepr   r   rt   gatherrJ   rM   rN   )rT   current_pendingtargetto_spawn_r   rW   rW   rX   rm      s*   zProcPool._main_task)r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r'   r   r)   r*   r   r+   r   r,   r'   r-   r'   r.   r/   r0   r1   r2   r3   )r2   rY   )r_   r`   r2   ra   )r2   r3   )rv   r   r2   r3   )r$   r%   r2   r3   )r2   r%   )r   r   r2   r3   )__name__
__module____qualname__r5   propertyr]   rj   rs   ru   r   r   r   r	   log_exceptionsr   r~   r   rm   __classcell__rW   rW   rU   rX   r      s"    -




-

A
r   )$
__future__r   rD   mathcollections.abcr   r   multiprocessing.contextr   typingr   r    r	   rc   r
   r   r   r   logr   r   utils.hw.cpur   r   r   r   job_executorr   
EventTypesr   ceil	cpu_countrF   EventEmitterr   rW   rW   rW   rX   <module>   s$    