
    Vi}                     \    d dl Z d dlZd dlmZmZmZmZ d dlmZ d dl	T  G d d          Z
dS )    N)AnyIterableOptionalTuple)*c                       e Zd ZdZddee         dee         defdZddZ	de
fd	Zddee         defd
Zdeee         ee         f         deee         ee         f         fdZddZdS )ProcessGroupManageru   Контекстный менеджер для безопасного запуска процессов с дочерними процессами.Nargstimeoutkwargsc                 d    d|d<   || _         || _        || _        d | _        d | _        d | _        d S )NTstart_new_session)r
   r   r   procstdoutstderr)selfr
   r   r   s       ./common/process_utils.py__init__zProcessGroupManager.__init__   s;    &*"#	04	%)%)    returnc                 H    t          j        | j        fi | j        | _        | S N)
subprocessPopenr
   r   r   )r   s    r   	__enter__zProcessGroupManager.__enter__   s%    $TY>>$+>>	r   c                 n    | j         r-| j                                         |                                  dS )NF)r   poll_terminate_group)r   exc_typeexc_valexc_tbs       r   __exit__zProcessGroupManager.__exit__   s4    9 	$))1!!###ur   c                    | j         sdS ||n| j        }	 | j                             |          }|                     |          \  | _        | _        | j         j        S # t          j        $ r | 	                                  w xY w)u`   Ожидание завершения процесса с обработкой таймаута.r   Nr   )
r   r   communicate_decode_outputsr   r   
returncoder   TimeoutExpiredr   )r   r   effective_timeoutout_errs       r   waitzProcessGroupManager.wait!   s    y 	1'.':GG	i++4E+FFG'+';';G'D'D$DK9''( 	 	 	!!###	s   AA %Br*   c                     |\  }}t          |t                    r|                                n|t          |t                    r|                                n|fS r   )
isinstancebytesdecode)r   r*   outerrs       r   r&   z#ProcessGroupManager._decode_outputs/   sQ    S&sE22;CJJLLL&sE22;CJJLLL
 	
r   c                    | j         r| j                                         dS t          j        | j         j                  }t          j        |t          j                   	 | j                             d           dS # t          j
        $ r Y nw xY wt          j        |t          j                   	 | j                             d           dS # t          j
        $ r t          | j        t          t          f          r$d                    d | j        D                       nt#          | j                  }d| j         j         d| d| }t$                              |d	
           Y dS w xY w)ut   Корректное завершение группы процессов: SIGTERM → ожидание → SIGKILL.N   r$    c              3   4   K   | ]}t          |          V  d S r   )str).0as     r   	<genexpr>z7ProcessGroupManager._terminate_group.<locals>.<genexpr>I   s(      99!s1vv999999r   uA   Процесс не завершился после SIGKILL: pid=z, pgid=u   , команда=ERROR)level)r   r   osgetpgidpidkillpgsignalSIGTERMr+   r   r(   SIGKILLr-   r
   listtuplejoinr6   gdebug)r   pgidcmd_strmsgs       r   r   z$ProcessGroupManager._terminate_group6   s   y 	DINN,,8Fz$)-((
	$'''	INN1N%%%F( 	 	 	D	 		$'''	(INN1N%%%%%( 	( 	( 	(=G	TXZ_S`=a=auchh99ty999999gjkoktguguG MVZV_Vc  M  Mlp  M  M  DK  M  MCGGCwG''''''		(s%   !A> >BB3C BE-,E-r   )r   r	   )r   N)__name__
__module____qualname____doc__r   r   r   floatr   r   boolr"   intr+   r   r.   r6   r&   r    r   r   r	   r	   	   s        ^  ^* *Xc] *Xe_ *WZ * * * *   T     HUO s    
uXe_huo-M'N 
SXYabeYfhpqthuYuSv 
 
 
 
( ( ( ( ( (r   r	   )r<   r@   typingr   r   r   r   gevent.subprocessr   cmf.includer	   rR   r   r   <module>rV      s    				  1 1 1 1 1 1 1 1 1 1 1 1 & & & & & &    B( B( B( B( B( B( B( B( B( B(r   