U
    RhS                     @  s   d dl mZ d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
mZ d dlZd dlmZ d dlmZ dd	 d
 D ZedZG dd dZG dd dZdS )    )annotationsN)Pipe)socket)AnyCallable)get_subprocess)Configc                 C  s.   i | ]&}t td | rttd | |qS )ZSIG)hasattrsignalgetattr).0x r   F./venv/lib/python3.8/site-packages/uvicorn/supervisors/multiprocess.py
<dictcomp>   s    r   z1INT TERM BREAK HUP QUIT TTIN TTOU USR1 USR2 WINCHzuvicorn.errorc                   @  s   e Zd ZdddddddZd&d	d
dddZddddZddddZd'dddddZd(d	d
dddZddddZ	ddddZ
dddd Zddd!d"Zed#dd$d%ZdS ))Processr   %Callable[[list[socket] | None], None]list[socket]Noneconfigtargetsocketsreturnc                 C  s(   || _ t \| _| _t|| j|| _d S N)real_targetr   parent_conn
child_connr   r   process)selfr   r   r   r   r   r   __init__   s    zProcess.__init__   floatbool)timeoutr   c                 C  s*   | j d | j |r&| j   dS dS )Ns   pingTF)r   sendZpollrecvr   r$   r   r   r   ping%   s
    
zProcess.pingr   c                 C  s   | j   | j d d S )Ns   pong)r   r&   r%   r   r   r   r   pong,   s    
zProcess.pongc                 C  s   |    q d S r   )r+   r*   r   r   r   always_pong0   s    zProcess.always_pongNzlist[socket] | Noner   )r   r   c                 C  s:   t jdkrttjdd  tj| jdd  | |S )Nntc                 S  s   t t jS r   )r
   raise_signalSIGTERMsigframer   r   r   <lambda>;       z Process.target.<locals>.<lambda>T)r   daemon)	osnamer
   ZSIGBREAK	threadingThreadr,   startr   )r   r   r   r   r   r   4   s    
zProcess.targetc                 C  s   | j  sdS | |S )NF)r   is_aliver(   r'   r   r   r   r;   A   s    
zProcess.is_alivec                 C  s   | j   d S r   )r   r:   r*   r   r   r   r:   G   s    zProcess.startc                 C  sz   | j jd krv| j jd k	sttjdkr:t| j jtj nt| j jtj	 t
d| j j d | j  | j  d S )Nr-   zTerminated child process [])r   ZexitcodepidAssertionErrorr6   r7   killr
   ZCTRL_BREAK_EVENTr/   loggerinfor   closer   r*   r   r   r   	terminateJ   s    

zProcess.terminatec                 C  s   | j   d S r   )r   r?   r*   r   r   r   r?   X   s    zProcess.killc                 C  s$   t d| jj d | j  d S )NzWaiting for child process [r<   )r@   rA   r   r=   joinr*   r   r   r   rD   ]   s    zProcess.joinz
int | Nonec                 C  s   | j jS r   )r   r=   r*   r   r   r   r=   a   s    zProcess.pid)r!   )N)r!   )__name__
__module____qualname__r    r(   r+   r,   r   r;   r:   rC   r?   rD   propertyr=   r   r   r   r   r      s   r   c                   @  s   e Zd ZdddddddZddd	d
ZddddZddddZddddZddddZddddZ	ddddZ
ddddZddddZddddZddddZdddd Zddd!d"Zd#S )$Multiprocessr   r   r   r   r   c                   sR   | _ | _| _|j _g  _t  _g  _	t
D ]}t| fdd q4d S )Nc                   s    j | S r   )signal_queueappendr0   r*   r   r   r3   x   r4   z'Multiprocess.__init__.<locals>.<lambda>)r   r   r   workersprocesses_num	processesr8   Eventshould_exitrJ   SIGNALSr
   )r   r   r   r   r1   r   r*   r   r    g   s    
zMultiprocess.__init__r)   c                 C  s:   t | jD ]*}t| j| j| j}|  | j| q
d S r   )	rangerM   r   r   r   r   r:   rN   rK   )r   _r   r   r   r   init_processesz   s    zMultiprocess.init_processesc                 C  s   | j D ]}|  qd S r   )rN   rC   r   r   r   r   r   terminate_all   s    
zMultiprocess.terminate_allc                 C  s   | j D ]}|  qd S r   )rN   rD   rU   r   r   r   join_all   s    
zMultiprocess.join_allc                 C  sL   t | jD ]<\}}|  |  t| j| j| j}|  || j|< q
d S r   )		enumeraterN   rC   rD   r   r   r   r   r:   )r   idxr   Znew_processr   r   r   restart_all   s    zMultiprocess.restart_allc                 C  s   dt   d}dtjtt  ddd}tj|d|id |   | j	
d	sf|   |   qH|   |   d
t   d}dtjtt  ddd}tj|d|id d S )NzStarted parent process [r<   zStarted parent process [{}]ZcyanT)ZfgZboldcolor_message)Zextrag      ?zStopping parent process [zStopping parent process [{}])r6   getpidformatclickZstylestrr@   rA   rT   rP   waithandle_signalskeep_subprocess_aliverV   rW   )r   messager[   r   r   r   run   s    
zMultiprocess.runc                 C  s   | j  rd S t| jD ]j\}}| r*q|  |  | j  rJ d S td|j	 d t
| j| j| j}|  || j|< qd S )NzChild process [z] died)rP   is_setrX   rN   r;   r?   rD   r@   rA   r=   r   r   r   r   r:   )r   rY   r   r   r   r   rb      s    

z"Multiprocess.keep_subprocess_alivec                 C  s`   t | jD ]P}| j| t| }t| d|  d }|d k	rH|  q
td| d q
d S )NZhandle_zReceived signal z#, but no handler is defined for it.)tuplerJ   removerQ   r   lowerr@   debug)r   r1   Zsig_nameZsig_handlerr   r   r   ra      s    zMultiprocess.handle_signalsc                 C  s   t d | j  d S )NzReceived SIGINT, exiting.r@   rA   rP   setr*   r   r   r   
handle_int   s    
zMultiprocess.handle_intc                 C  s   t d | j  d S )NzReceived SIGTERM, exiting.rj   r*   r   r   r   handle_term   s    
zMultiprocess.handle_termc                 C  s   t d | j  d S )NzReceived SIGBREAK, exiting.rj   r*   r   r   r   handle_break   s    
zMultiprocess.handle_breakc                 C  s   t d |   d S )Nz&Received SIGHUP, restarting processes.)r@   rA   rZ   r*   r   r   r   
handle_hup   s    
zMultiprocess.handle_hupc                 C  sB   t d |  jd7  _t| j| j| j}|  | j	| d S )Nz5Received SIGTTIN, increasing the number of processes.   )
r@   rA   rM   r   r   r   r   r:   rN   rK   rU   r   r   r   handle_ttin   s
    
zMultiprocess.handle_ttinc                 C  sN   t d | jdkr"t d d S |  jd8  _| j }|  |  d S )Nz1Received SIGTTOU, decreasing number of processes.rp   zMAlready reached one process, cannot decrease the number of processes anymore.)r@   rA   rM   rN   poprC   rD   rU   r   r   r   handle_ttou   s    



zMultiprocess.handle_ttouN)rE   rF   rG   r    rT   rV   rW   rZ   rd   rb   ra   rl   rm   rn   ro   rq   rs   r   r   r   r   rI   f   s   
rI   )Z
__future__r   Zloggingr6   r
   r8   Zmultiprocessingr   r   typingr   r   r^   Zuvicorn._subprocessr   Zuvicorn.configr   splitrQ   Z	getLoggerr@   r   rI   r   r   r   r   <module>   s    
M