o
    NK&hD"                     @   s   d dl Z d dlmZmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d d	lmZmZ d d
lmZmZ dd ZG dd dZG dd dZdS )    N)datetimetimezone)	signature)BaseContext)SIGINT)Thread)sleep)Any)Colorslogger)ProcessStateRestartOrderc                  C   s   t jtjd} | S )N)tz)r   nowr   utc)r    r   G/var/www/html/venv/lib/python3.10/site-packages/sanic/worker/process.pyget_now   s   r   c                   @   s   e Zd ZdZdZdZdZ	d(defddZd(d	e	fd
dZ
dd Zdd Zdd Zdd ZejfddZdd Zdd Zedd Zedd Zdd Zd d! Zd"d# Zd$efd%d&Zd'S ))WorkerProcesszA worker process.i,  ServerSrvFrestartablec                 C   sb   t j| _|| _|| _|| _|| _|| _|| _|| _	| j| jvr+d| j
| jv i| j| j< |   d S )Nserver)r   IDLEstatefactorynameidenttargetkwargsworker_stater   SERVER_LABELspawn)selfr   r   r   r   r   r    r   r   r   r   __init__   s   
zWorkerProcess.__init__r   c                 C   sD   |s|| j k rtd|| _ i | j| j d| j ji| j| j< d S )Nz...r   )r   	Exceptionr    r   )r#   r   forcer   r   r   	set_state3   s   
zWorkerProcess.set_statec                 C   s   | j tjd< | jtjd< ttj dtj tj	 dtj
 | j  | tj | j  | tj | j| j  dsOi | j| j  | jt dd| j| j < tjd= tjd= d S )NSANIC_WORKER_NAMESANIC_WORKER_IDENTIFIERzStarting a process: z%sstarts   )pidstart_atr*   )r   osenvironr   r   debugr
   BLUEBOLDSANICENDr'   r   STARTING_current_processstartSTARTEDr    getr,   r   r#   r   r   r   r7   <   s.   

zWorkerProcess.startc                 C   s   |  tj | j  d S N)r'   r   JOINEDr6   joinr:   r   r   r   r=   Q   s   zWorkerProcess.joinc                 C   s   d}|   r|dkrtd |d8 }|   r|dks
|   sDz| j| j= W d S  ty5   td Y d S  tyC   td Y d S w d S )Nd   r   皙?r+   z#Monitor process has already exited.z&Could not find worker state to delete.)is_aliver   r    r   ConnectionRefusedErrorr   r0   KeyError)r#   limitr   r   r   exitU   s   zWorkerProcess.exitc              
   C   s   | j tjurAttj dtj tj dtj dtj	 | j
| j | jtjdd z
t| jt W d S  tttfy@   Y d S w d S )NzTerminating a process: %s [%s]Tr&   )r   r   
TERMINATEDr   r0   r
   r1   r2   r3   r4   r   r,   r'   r.   killr   rB   AttributeErrorProcessLookupErrorr:   r   r   r   	terminatec   s*   zWorkerProcess.terminatec              
   K   s  t tj dtj tj dtj dtj | j| j | j	t
jdd |tju r-|   n| j| _|  rD| jddd | D i z
|   |   W n tyY   td	w |tju rc|   i | j| j | j| j| j d
 d t d| j| j< d S )NzRestarting a process: rE   rF   TrG   configc                 S   s   i | ]	\}}|  |qS r   )upper).0kvr   r   r   
<dictcomp>   s    z)WorkerProcess.restart.<locals>.<dictcomp>zRestart failedr*   r+   )r,   r*   
restart_at)r   r0   r
   r1   r2   r3   r4   r   r,   r'   r   
RESTARTINGr   SHUTDOWN_FIRST_terminate_nowr6   _old_process_add_configr   updateitemsr"   r7   rJ   RuntimeErrorSTARTUP_FIRST_terminate_soonr    r   )r#   restart_orderr   r   r   r   restartr   s@   



zWorkerProcess.restartc                 C   s"   z| j  W S  ty   Y dS w )NF)r6   r@   AssertionErrorr:   r   r   r   r@      s
   zWorkerProcess.is_alivec                 C   s8   | j tjtjfvrtd| j| j| j| jdd| _	d S )Nz/Cannot spawn a worker process until it is idle.T)r   r   r   daemon)
r   r   r   rT   r%   r   r   r   r   r6   r:   r   r   r   r"      s   zWorkerProcess.spawnc                 C      | j jS r;   )r6   r,   r:   r   r   r   r,         zWorkerProcess.pidc                 C   rb   r;   )r6   exitcoder:   r   r   r   rd      rc   zWorkerProcess.exitcodec              
   C   sT   | j  sd S ttj dtj tj dtj dtj | j	| j j
 | j   d S )NBegin restart termination: rE   rF   )r6   r@   r   r0   r
   r1   r2   r3   r4   r   r,   rL   r:   r   r   r   rV      s    
zWorkerProcess._terminate_nowc              
   C   sP   t tj dtj tj dtj dtj | j| jj	 t
| jd}|  d S )Nre   rE   rF   )r   )r   r0   r
   r1   r2   r3   r4   r   r6   r,   r   _wait_to_terminater7   )r#   termination_threadr   r   r   r]      s   zWorkerProcess._terminate_soonc              
   C   s   t tj dtj tj dtj dtj | j| jj	 d}| j
tjurFtd |d7 }|| jkr@td| j d| jd	  d
| j
tjus$t tj dtj tj dtj dtj | j| jj	 | j  t| d d S )Nz!Waiting for process to be acked: rE   rF   r   r?   r+   zWorker z failed to come ack within 
   z secondszProcess acked. Terminating: rW   )r   r0   r
   r1   r2   r3   r4   r   rW   r,   r   r   ACKEDr   	THRESHOLDTimeoutErrorrL   delattr)r#   missesr   r   r   rf      sN   

	
z WorkerProcess._wait_to_terminatereturnc                 C   s4   t | j}d|jv stdd |j D rdS dS )NrM   c                 s   s    | ]	}|j |jkV  qd S r;   )kindVAR_KEYWORD)rO   paramr   r   r   	<genexpr>   s
    

z,WorkerProcess._add_config.<locals>.<genexpr>TF)r   r   
parametersanyvalues)r#   sigr   r   r   rX      s   
zWorkerProcess._add_configN)F)__name__
__module____qualname____doc__rj   r!   SERVER_IDENTIFIERboolr$   r   r'   r7   r=   rD   rL   r   rU   r_   r@   r"   propertyr,   rd   rV   r]   rf   rX   r   r   r   r   r      s2    

	 


r   c                   @   sh   e Zd ZdZ				ddedededeeef d	ed
e	de	de	fddZ
defddZde	fddZdS )WorkerSanicr+   FTr   r   contextr    numr   tracked
auto_startc                 C   s^   || _ || _|| _|| _|| _|| _|| _t | _|| _	|	| _
|
| _t|D ]}|   q&d S r;   )r   r   r   r   serveserver_settingsr    set	processesr   r   r   rangecreate_process)r#   r   r   r   r   r   r    r   r   r   r   _r   r   r   r$      s   
zWorker.__init__rn   c              	   C   sR   t | jjd| j| jtt| jg| j	| j
i | j| j| jd}| j| |S )N-)r   r   r   r   r   r    r   )r   r   Processr=   WORKER_PREFIXr   strlenr   r   r   r   r    r   add)r#   processr   r   r   r     s   zWorker.create_processc                 C   s   t dd | jD S )Nc                 s   s    | ]}|  V  qd S r;   )r@   )rO   r   r   r   r   rr     s    z-Worker.has_alive_processes.<locals>.<genexpr>)rt   r   r:   r   r   r   has_alive_processes  s   zWorker.has_alive_processesN)r+   FTT)rw   rx   ry   r   r   r   dictr	   intr|   r$   r   r   r   r   r   r   r   r~      s2    

	

r~   )r.   r   r   inspectr   multiprocessing.contextr   signalr   	threadingr   timer   typingr	   	sanic.logr
   r   sanic.worker.constantsr   r   r   r   r~   r   r   r   r   <module>   s     T