
    sg                         d dl 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	m
Z
mZmZmZ ddlmZmZmZmZ g dZ e j(                  e      Z G d de      Z G d	 d
e      Z G d de      Zy)    N)Empty)AnyDictListSetTuple   )RequestQueueTimerClientTimerRequestTimerServer)LocalTimerClientMultiprocessingRequestQueueLocalTimerServerc                   .     e Zd ZdZ fdZd Zd Z xZS )r   aF  
    Client side of ``LocalTimerServer``. This client is meant to be used
    on the same host that the ``LocalTimerServer`` is running on and uses
    pid to uniquely identify a worker. This is particularly useful in situations
    where one spawns a subprocess (trainer) per GPU on a host with multiple
    GPU devices.
    c                 0    t         |           || _        y Nsuper__init__	_mp_queueselfmp_queue	__class__s     ^/var/www/html/venv/lib/python3.12/site-packages/torch/distributed/elastic/timer/local_timer.pyr   zLocalTimerClient.__init__        !    c                 |    t        j                         }t        |||      }| j                  j	                  |       y r   osgetpidr   r   put)r   scope_idexpiration_timepidacquire_requests        r   acquirezLocalTimerClient.acquire$   s-    iik&sHoF?+r   c                 |    t        j                         }t        ||d      }| j                  j	                  |       y )Nr    )r   r$   r&   release_requests       r   releasezLocalTimerClient.release)   s-    iik&sHb9?+r   )__name__
__module____qualname____doc__r   r(   r,   __classcell__r   s   @r   r   r      s    ",
,r   r   c                   ^     e Zd ZdZdej
                  f fdZdefdZde	de
e   fdZ xZS )r   zG
    A ``RequestQueue`` backed by python ``multiprocessing.Queue``
    r   c                 0    t         |           || _        y r   r   r   s     r   r   z$MultiprocessingRequestQueue.__init__4   r   r   returnc                 6    | j                   j                         S r   )r   qsize)r   s    r   sizez MultiprocessingRequestQueue.size8   s    ~~##%%r   timeoutc                    g }|}t        d|      D ]g  }t        j                         }	 | j                  j                  d|      }|j                  |       |t        j                         |z
  z
  }|dk  sf |S  |S # t        $ r Y  |S w xY w)Nr   T)blockr9   )rangetimer   getr   append)r   r8   r9   requestswait_startrs           r   r>   zMultiprocessingRequestQueue.get;   s    q$ 	AIIKENN&&T4&@ OOA499;./Dqy	    s   A==	B
B)r-   r.   r/   r0   mpQueuer   intr8   floatr   r   r>   r1   r2   s   @r   r   r   /   s<    " "&c & 4+= r   r   c                        e Zd ZdZ	 ddej
                  dedef fdZde	e
   ddfd	Zd
ee   ddfdZdedeee	e
   f   fdZdedefdZ xZS )r   aK  
    Server that works with ``LocalTimerClient``. Clients are expected to be
    subprocesses to the parent process that is running this server. Each host
    in the job is expected to start its own timer server locally and each
    server instance manages timers for local workers (running on processes
    on the same host).
    r   max_intervaldaemonc                 H    t         |   t        |      ||       i | _        y r   )r   r   r   _timers)r   r   rJ   rK   r   s       r   r   zLocalTimerServer.__init__W   s#     	4X>fU<>r   timer_requestsr5   Nc                     |D ][  }|j                   }|j                  }|j                  }|dk  r| j                  j	                  ||fd        K|| j                  ||f<   ] y )Nr   )	worker_idr$   r%   rM   pop)r   rN   requestr&   r$   r%   s         r   register_timersz LocalTimerServer.register_timers]   sf    % 		8G##C''H%55O "  #x$707c8_-		8r   
worker_idsc                     t        | j                  j                               D ]'  \  }}||v s| j                  j                  ||f       ) y r   )listrM   keysrQ   )r   rT   r&   r$   s       r   clear_timerszLocalTimerServer.clear_timersi   sE    !$,,"3"3"56 	2MCj   #x1	2r   deadlinec                     i }| j                   j                         D ]?  }|j                  |k  s|j                  |j                  g       }|j                  |       A |S r   )rM   valuesr%   
setdefaultrP   r?   )r   rY   expired_timersrR   expired_scopess        r   get_expired_timersz#LocalTimerServer.get_expired_timersn   s_    8:||**, 	/G&&(2!/!:!:7;L;Lb!Q%%g.	/ r   rP   c                     	 t        j                  |t        j                         y# t        $ r t
        j                  d|       Y yt        $ r t
        j                  d|       Y yw xY w)NTz,Process with pid=%s does not exist. SkippingzError terminating pid=%sF)	r!   killsignalSIGKILLProcessLookupErrorloggerinfo	Exception	exception)r   rP   s     r   _reap_workerzLocalTimerServer._reap_workerw   s\    	DGGIv~~.! 	KKF	R 	D7C	Ds   $' A)A)(A))<   T)r-   r.   r/   r0   rE   rF   rH   boolr   r   r   rS   r   rG   rX   r   r   r_   ri   r1   r2   s   @r   r   r   N   s     LP??05?DH?
8d<.@ 
8T 
82s3x 2D 2
5 T#tL?Q:Q5R 	c 	d 	r   r   )loggingmultiprocessingrE   r!   rb   r=   queuer   typingr   r   r   r   r   apir
   r   r   r   __all__	getLoggerr-   re   r   r   r    r   r   <module>rt      sc      	    . . E E R			8	$,{ ,0, >2{ 2r   