
    (<i}                     V    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	  G d d      Z
y)    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y)ProcessGroupManageru   Контекстный менеджер для безопасного запуска процессов с дочерними процессами.Nargstimeoutkwargsc                 b    d|d<   || _         || _        || _        d | _        d | _        d | _        y )NTstart_new_session)r
   r   r   procstdoutstderr)selfr
   r   r   s       ./common/process_utils.py__init__zProcessGroupManager.__init__   s7    &*"#	04	%)%)    returnc                 d    t        j                  | j                  fi | j                  | _        | S N)
subprocessPopenr
   r   r   )r   s    r   	__enter__zProcessGroupManager.__enter__   s&    $$TYY>$++>	r   c                 p    | j                   r*| j                   j                         | j                          y)NF)r   poll_terminate_group)r   exc_typeexc_valexc_tbs       r   __exit__zProcessGroupManager.__exit__   s(    99)1!!#r   c                 .   | j                   sy||n| j                  }	 | j                   j                  |      }| j                  |      \  | _        | _        | j                   j                  S # t        j                  $ r | j                           w xY w)u`   Ожидание завершения процесса с обработкой таймаута.r   r   )
r   r   communicate_decode_outputsr   r   
returncoder   TimeoutExpiredr   )r   r   effective_timeoutout_errs       r   waitzProcessGroupManager.wait!   s    yy'.':G	ii++4E+FG'+';';G'D$DK99'''(( 	!!#	s   AA/ /%Br*   c                     |\  }}t        |t              r|j                         n|t        |t              r|j                         fS |fS r   )
isinstancebytesdecode)r   r*   outerrs       r   r&   z#ProcessGroupManager._decode_outputs/   sH    S&sE2CJJL&sE2CJJL
 	
8;
 	
r   c                 (   | j                   r| j                   j                         yt        j                  | j                   j                        }t        j
                  |t        j                         	 | j                   j                  d       y# t        j                  $ r Y nw xY wt        j
                  |t        j                         	 | j                   j                  d       y# t        j                  $ r t        | j                  t        t        f      r"dj!                  d | j                  D              nt#        | j                        }d| j                   j                   d| d| }t$        j'                  |d	
       Y yw xY w)ut   Корректное завершение группы процессов: SIGTERM → ожидание → SIGKILL.N   r$    c              3   2   K   | ]  }t        |        y wr   )str).0as     r   	<genexpr>z7ProcessGroupManager._terminate_group.<locals>.<genexpr>I   s     9!s1v9s   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<   yyDIINN,8zz$))--(
		$'	IINN1N%(( 		 			$'	(IINN1N%(( 	(=G		TXZ_S`=achh9tyy99gjkoktktguGUVZV_V_VcVcUddklpkq  rC  DK  CL  MCGGCwG'		(s%   6B B)(B)C. .B FF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 & B( B(r   