o
    4ήc                     @   s   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 d dl	m
Z
mZmZ d dlZd dlmZ d dlmZ ejejfZe dZG d	d
 d
ZdS )    N)SpawnProcess)socket)	FrameType)CallableListOptional)get_subprocess)Configzuvicorn.errorc                   @   st   e Zd Zdedeeee  gdf dee ddfddZde	d	ee
 ddfd
dZdddZdddZdddZdS )MultiprocessconfigtargetNsocketsreturnc                 C   s0   || _ || _|| _g | _t | _t | _	d S N)
r   r   r   	processes	threadingEventshould_exitosgetpidpid)selfr   r   r    r   G/tmp/pip-target-vg8gfxp4/lib/python/uvicorn/supervisors/multiprocess.py__init__   s   
zMultiprocess.__init__sigframec                 C   s   | j   dS )zN
        A signal handler that is registered with the parent process.
        N)r   set)r   r   r   r   r   r   signal_handler%   s   zMultiprocess.signal_handlerc                 C   s   |    | j  |   d S r   )startupr   waitshutdown)r   r   r   r   run+   s   
zMultiprocess.runc                 C   s   d t| j}d tjt| jddd}tj|d|id tD ]	}t|| j	 q!t
| jjD ]}t| j| j| jd}|  | j| q1d S )NzStarted parent process [{}]cyanTfgboldcolor_messageextra)r   r   r   )formatstrr   clickstyleloggerinfoHANDLED_SIGNALSsignalr   ranger   workersr   r   r   startr   append)r   messager'   r   idxprocessr   r   r   r   0   s   zMultiprocess.startupc                 C   s^   | j D ]
}|  |  qdt| j}dtjt| jddd}tj	|d|id d S )NzStopping parent process [{}]r#   Tr$   r'   r(   )
r   	terminatejoinr*   r+   r   r,   r-   r.   r/   )r   r8   r6   r'   r   r   r   r!   A   s   

zMultiprocess.shutdown)r   N)__name__
__module____qualname__r	   r   r   r   r   r   intr   r   r"   r   r!   r   r   r   r   r
      s    


r
   )loggingr   r1   r   multiprocessing.contextr   r   typesr   typingr   r   r   r,   uvicorn._subprocessr   uvicorn.configr	   SIGINTSIGTERMr0   	getLoggerr.   r
   r   r   r   r   <module>   s     
