
    gS                    8   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j#                         D  ci c]  }  eed	|        r eed	|        |  c} Z ej*                  d
      Z G d d      Z G d d      Zyc c} w )    )annotationsN)Pipe)socket)AnyCallable)get_subprocess)Configz1INT TERM BREAK HUP QUIT TTIN TTOU USR1 USR2 WINCHSIGzuvicorn.errorc                      e Zd Z	 	 	 	 	 	 	 	 ddZdddZddZddZdddZdddZddZ	dd	Z
dd
ZddZedd       Zy)Processc                x    || _         t               \  | _        | _        t	        || j
                  |      | _        y N)real_targetr   parent_conn
child_connr   targetprocess)selfconfigr   socketss       U/var/www/openai/venv/lib/python3.12/site-packages/uvicorn/supervisors/multiprocess.py__init__zProcess.__init__   s1     ",0F)$/%fdkk7C    c                    | j                   j                  d       | j                   j                  |      r| j                   j                          yy)Ns   pingTF)r   sendpollrecvr   timeouts     r   pingzProcess.ping%   sB    g&  )!!#r   c                n    | j                   j                          | j                   j                  d       y )Ns   pong)r   r   r   r   s    r   pongzProcess.pong,   s$    W%r   c                &    	 | j                          r   )r#   r"   s    r   always_pongzProcess.always_pong0   s    IIK r   Nc                    t         j                  dk(  r%t        j                  t        j                  d        t	        j
                  | j                  d      j                          | j                  |      S )Nntc                H    t        j                  t         j                        S r   )signalraise_signalSIGTERM)sigframes     r   <lambda>z Process.target.<locals>.<lambda>;   s    6#6#6v~~#Fr   T)r   daemon)	osnamer)   SIGBREAK	threadingThreadr%   startr   )r   r   s     r   r   zProcess.target4   sW    77d? MMF
 	 0 0>DDF((r   c                Z    | j                   j                         sy| j                  |      S )NF)r   is_aliver    r   s     r   r7   zProcess.is_aliveA   s$    ||$$&yy!!r   c                8    | j                   j                          y r   )r   r5   r"   s    r   r5   zProcess.startG   s    r   c                ,   | j                   j                  | j                   j                  J t        j                  dk(  r9t        j
                  | j                   j                  t        j                         n8t        j
                  | j                   j                  t        j                         t        j                  d| j                   j                   d       | j                  j                          | j                  j                          y y )Nr'   zTerminated child process [])r   exitcodepidr0   r1   killr)   CTRL_BREAK_EVENTr+   loggerinfor   closer   r"   s    r   	terminatezProcess.terminateJ   s    <<  (<<##///ww$ ((&*A*AB((&..9KK4T\\5E5E4FaHI""$OO!!# )r   c                8    | j                   j                          y r   )r   r=   r"   s    r   r=   zProcess.killX   s     	r   c                    t         j                  d| j                  j                   d       | j                  j	                          y )NzWaiting for child process [r:   )r?   r@   r   r<   joinr"   s    r   rE   zProcess.join]   s3    1$,,2B2B1C1EFr   c                .    | j                   j                  S r   )r   r<   r"   s    r   r<   zProcess.pida   s    ||r   r   r	   r   z%Callable[[list[socket] | None], None]r   zlist[socket]returnNone)   )r   floatrH   boolrH   rI   r   )r   zlist[socket] | NonerH   r   )rH   z
int | None)__name__
__module____qualname__r   r    r#   r%   r   r7   r5   rB   r=   rE   propertyr<    r   r   r   r      ss    	D	D 6	D 		D
 
	D&)"$
    r   r   c                      e Zd Z	 	 	 	 	 	 	 	 ddZddZddZddZddZddZddZ	ddZ
dd	Zdd
ZddZddZddZddZy)Multiprocessc                     | _         | _        | _        |j                   _        g  _        t        j                          _        g  _	        t        D ]  }t        j                  | fd        y )Nc                :    j                   j                  |       S r   )signal_queueappend)r,   r-   r   s     r   r.   z'Multiprocess.__init__.<locals>.<lambda>x   s    $2C2C2J2J32Or   )r   r   r   workersprocesses_num	processesr3   Eventshould_exitrW   SIGNALSr)   )r   r   r   r   r,   s   `    r   r   zMultiprocess.__init__g   s]     #^^(*$??,')CMM#OP r   c                    t        | j                        D ]X  }t        | j                  | j                  | j
                        }|j                          | j                  j                  |       Z y r   )	rangerZ   r   r   r   r   r5   r[   rX   )r   _r   s      r   init_processeszMultiprocess.init_processesz   sL    t))*Adkk4;;EGMMONN!!'* +r   c                F    | j                   D ]  }|j                           y r   )r[   rB   r   r   s     r   terminate_allzMultiprocess.terminate_all   s    ~~G &r   c                F    | j                   D ]  }|j                           y r   )r[   rE   rd   s     r   join_allzMultiprocess.join_all   s    ~~GLLN &r   c                   t        | j                        D ]o  \  }}|j                          |j                          t	        | j
                  | j                  | j                        }|j                          || j                  |<   q y r   )		enumerater[   rB   rE   r   r   r   r   r5   )r   idxr   new_processs       r   restart_allzMultiprocess.restart_all   sb    %dnn5LCLLN!$++t{{DLLIK"-DNN3 6r   c                   dt        j                          d}dj                  t        j                  t        t        j                               dd            }t        j                  |d|i       | j                          | j                  j                  d	      s<| j                          | j                          | j                  j                  d	      s<| j                          | j                          d
t        j                          d}dj                  t        j                  t        t        j                               dd            }t        j                  |d|i       y )NzStarted parent process [r:   zStarted parent process [{}]cyanT)fgboldcolor_message)extrag      ?zStopping parent process [zStopping parent process [{}])r0   getpidformatclickstylestrr?   r@   rb   r]   waithandle_signalskeep_subprocess_alivere   rg   )r   messagerq   s      r   runzMultiprocess.run   s   ,RYY[M;5<<U[[RYY[IY^dko=pqGO]#CD""'',!&&( ""'', 	-biik]!<6==ekk#biikJZ_elp>qrGO]#CDr   c                   | j                   j                         ry t        | j                        D ]  \  }}|j	                         r|j                          |j                          | j                   j                         r y t        j                  d|j                   d       t        | j                  | j                  | j                        }|j                          || j                  |<    y )NzChild process [z] died)r]   is_setri   r[   r7   r=   rE   r?   r@   r<   r   r   r   r   r5   )r   rj   r   s      r   rz   z"Multiprocess.keep_subprocess_alive   s    ""$%dnn5LC!LLNLLN&&(KK/'++f=>dkk4;;EGMMO")DNN3 6r   c                   t        | j                        D ]g  }| j                  j                  |       t        |   }t	        | d|j                          d       }| |        Ot        j                  d| d       i y )Nhandle_zReceived signal z#, but no handler is defined for it.)tuplerW   remover^   getattrlowerr?   debug)r   r,   sig_namesig_handlers       r   ry   zMultiprocess.handle_signals   ss    **+C$$S)s|H!$'(..2B1C(DdKK&/z9\]^ ,r   c                b    t         j                  d       | j                  j                          y )NzReceived SIGINT, exiting.r?   r@   r]   setr"   s    r   
handle_intzMultiprocess.handle_int   s!    /0r   c                b    t         j                  d       | j                  j                          y )NzReceived SIGTERM, exiting.r   r"   s    r   handle_termzMultiprocess.handle_term   s!    01r   c                b    t         j                  d       | j                  j                          y )NzReceived SIGBREAK, exiting.r   r"   s    r   handle_breakzMultiprocess.handle_break   s!    12r   c                N    t         j                  d       | j                          y )Nz&Received SIGHUP, restarting processes.)r?   r@   rl   r"   s    r   
handle_hupzMultiprocess.handle_hup   s    <=r   c                   t         j                  d       | xj                  dz  c_        t        | j                  | j
                  | j                        }|j                          | j                  j                  |       y )Nz5Received SIGTTIN, increasing the number of processes.   )
r?   r@   rZ   r   r   r   r   r5   r[   rX   rd   s     r   handle_ttinzMultiprocess.handle_ttin   sU    KLa$++t{{DLLAg&r   c                   t         j                  d       | j                  dk  rt         j                  d       y | xj                  dz  c_        | j                  j	                         }|j                          |j                          y )Nz1Received SIGTTOU, decreasing number of processes.r   zMAlready reached one process, cannot decrease the number of processes anymore.)r?   r@   rZ   r[   poprB   rE   rd   s     r   handle_ttouzMultiprocess.handle_ttou   se    GH"KKgha..$$&r   NrG   rM   )rN   rO   rP   r   rb   re   rg   rl   r|   rz   ry   r   r   r   r   r   r   rR   r   r   rT   rT   f   su    QQ 6Q 	Q
 
Q&+ .E$*&_'r   rT   )
__future__r   loggingr0   r)   r3   multiprocessingr   r   typingr   r   ru   uvicorn._subprocessr   uvicorn.configr	   splithasattrr   r^   	getLoggerr?   r   rT   )xs   0r   <module>r      s    "  	         . ! AFFHHvQCy! Fc!I!H 
		?	+J  J Zx xms    B