
    Vh                        d Z ddlmZ ddlmZ ddlmZmZmZ ddl	m
Z
 ddlmZ ddlmZ dd	lmZ  G d
 d      Z e
e       G d d             Zy)zZ
Implementation of a L{Team} of workers; a thread-pool that can allocate work to
workers.
    )annotations)deque)CallableOptionalSet)implementer   )IWorker)Quit)IExclusiveWorkerc                  (    e Zd ZdZ	 	 	 	 	 	 	 	 ddZy)
Statisticsa  
    Statistics about a L{Team}'s current activity.

    @ivar idleWorkerCount: The number of idle workers.
    @type idleWorkerCount: L{int}

    @ivar busyWorkerCount: The number of busy workers.
    @type busyWorkerCount: L{int}

    @ivar backloggedWorkCount: The number of work items passed to L{Team.do}
        which have not yet been sent to a worker to be performed because not
        enough workers are available.
    @type backloggedWorkCount: L{int}
    c                .    || _         || _        || _        y N)idleWorkerCountbusyWorkerCountbackloggedWorkCount)selfr   r   r   s       F/home/dcms/DCMS/lib/python3.12/site-packages/twisted/_threads/_team.py__init__zStatistics.__init__%   s      /.#6     N)r   intr   r   r   r   returnNone)__name__
__module____qualname____doc__r    r   r   r   r      s,    7"7587OR7	7r   r   c                  h    e Zd ZdZ	 	 	 	 	 	 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y)Teamax  
    A composite L{IWorker} implementation.

    @ivar _quit: A L{Quit} flag indicating whether this L{Team} has been quit
        yet.  This may be set by an arbitrary thread since L{Team.quit} may be
        called from anywhere.

    @ivar _coordinator: the L{IExclusiveWorker} coordinating access to this
        L{Team}'s internal resources.

    @ivar _createWorker: a callable that will create new workers.

    @ivar _logException: a 0-argument callable called in an exception context
        when there is an unhandled error from a task passed to L{Team.do}

    @ivar _idle: a L{set} of idle workers.

    @ivar _busyCount: the number of workers currently busy.

    @ivar _pending: a C{deque} of tasks - that is, 0-argument callables passed
        to L{Team.do} - that are outstanding.

    @ivar _shouldQuitCoordinator: A flag indicating that the coordinator should
        be quit at the next available opportunity.  Unlike L{Team._quit}, this
        flag is only set by the coordinator.

    @ivar _toShrink: the number of workers to shrink this L{Team} by at the
        next available opportunity; set in the coordinator.
    c                    t               | _        || _        || _        || _        t               | _        d| _        t               | _	        d| _
        d| _        y)a  
        @param coordinator: an L{IExclusiveWorker} which will coordinate access
            to resources on this L{Team}; that is to say, an
            L{IExclusiveWorker} whose C{do} method ensures that its given work
            will be executed in a mutually exclusive context, not in parallel
            with other work enqueued by C{do} (although possibly in parallel
            with the caller).

        @param createWorker: A 0-argument callable that will create an
            L{IWorker} to perform work.

        @param logException: A 0-argument callable called in an exception
            context when the work passed to C{do} raises an exception.
        r   FN)r   _quit_coordinator_createWorker_logExceptionset_idle
_busyCountr   _pending_shouldQuitCoordinator	_toShrink)r   coordinatorcreateWorkerlogExceptions       r   r   zTeam.__init__M   sO    ( V
')) $'5
8=&+#r   c                |    t        t        | j                        | j                  t        | j                              S )z
        Gather information on the current status of this L{Team}.

        @return: a L{Statistics} describing the current state of this L{Team}.
        )r   lenr(   r)   r*   r   s    r   
statisticszTeam.statisticsm   s(     #djj/4??C<NOOr   c                |      j                   j                           j                  j                  d fd       }y)z
        Increase the the number of idle workers by C{n}.

        @param n: The number of new idle workers to create.
        @type n: L{int}
        c                 p    t              D ]'  } j                         }| y j                  |       ) y r   )ranger%   _recycleWorker)xworkernr   s     r   createOneWorkerz"Team.grow.<locals>.createOneWorker~   s:    1X ,++->##F+	,r   Nr   r   r#   checkr$   do)r   r:   r;   s   `` r   growz	Team.growu   s3     	

						, 
	,r   Nc                z      j                   j                           j                  j                   fd       y)z
        Decrease the number of idle workers by C{n}.

        @param n: The number of idle workers to shut down, or L{None} (or
            unspecified) to shut down all workers.
        @type n: L{int} or L{None}
        c                 &    j                         S r   )_quitIdlers)r:   r   s   r   <lambda>zTeam.shrink.<locals>.<lambda>   s    T%5%5a%8 r   Nr=   )r   r:   s   ``r   shrinkzTeam.shrink   s*     	

89r   c                n   |"t        | j                        | j                  z   }t        |      D ]L  }| j                  r)| j                  j	                         j                          8| xj                  dz  c_        N | j                  r+| j                  dk(  r| j                  j                          yyy)z|
        The implmentation of C{shrink}, performed by the coordinator worker.

        @param n: see L{Team.shrink}
        Nr	   r   )	r1   r(   r)   r6   popquitr,   r+   r$   )r   r:   r8   s      r   rC   zTeam._quitIdlers   s     9DJJ$//1Aq 	$Azz

 %%'!#		$
 &&4??a+?""$ ,@&r   c                z      j                   j                           j                  j                   fd       y)zu
        Perform some work in a worker created by C{createWorker}.

        @param task: the callable to run
        c                 &     j                        S r   )_coordinateThisTaskr   tasks   r   rD   zTeam.do.<locals>.<lambda>   s    T%=%=d%C r   Nr=   rL   s   ``r   r?   zTeam.do   s*     	

CDr   c                     j                   r j                   j                         n j                         }| j                  j	                         y| xj
                  dz  c_        |j                  d fd       }y)z
        Select a worker to dispatch to, either an idle one or a new one, and
        perform it.

        This method should run on the coordinator worker.

        @param task: the task to dispatch
        @type task: 0-argument callable
        Nr	   c                     	          j                  j                  dfd       } y # t         $ r j                          Y <w xY w)Nc                 R    xj                   dz  c_         j                          y )Nr	   )r)   r7   )not_none_workerr   s   r   idleAndPendingz@Team._coordinateThisTask.<locals>.doWork.<locals>.idleAndPending   s    1$##O4r   r<   )BaseExceptionr&   r$   r?   )rR   rQ   r   rM   s    r   doWorkz(Team._coordinateThisTask.<locals>.doWork   sJ    % !!5 "5	 ! %""$%s   + AAr<   )r(   rG   r%   r*   appendr)   r?   )r   rM   r9   rT   rQ   s   ``  @r   rK   zTeam._coordinateThisTask   sk     &*ZZ!T5G5G5I> MM  & 1			5 
		5r   c                   | j                   j                  |       | j                  r*| j                  | j                  j	                                y| j
                  r| j                          y| j                  dkD  rA| xj                  dz  c_        | j                   j                  |       |j                          yy)z
        Called only from coordinator.

        Recycle the given worker into the idle pool.

        @param worker: a worker created by C{createWorker} and now idle.
        @type worker: L{IWorker}
        r   r	   N)
r(   addr*   rK   popleftr+   rC   r,   removerH   )r   r9   s     r   r7   zTeam._recycleWorker   s     	

v== $$T]]%:%:%<=((^^aNNaNJJf%KKM  r   c                x      j                   j                           j                  j                  d fd       }y)zA
        Stop doing work and shut down all idle workers.
        c                 4    d _          j                          y )NT)r+   rC   r2   s   r   startFinishingz!Team.quit.<locals>.startFinishing   s    *.D'r   Nr<   )r#   r'   r$   r?   )r   r\   s   ` r   rH   z	Team.quit   s3     	

 
					 
	r   )r-   r   r.   zCallable[[], Optional[IWorker]]r/   zCallable[[], None])r   r   )r:   r   r   r   r   )r:   zOptional[int]r   r   )rM   zCallable[[], object]r   r   )rM   zCallable[..., object]r   r   )r9   r
   r   r   r<   )r   r   r   r   r   r3   r@   rE   rC   r?   rK   r7   rH   r   r   r   r!   r!   -   sS    <% 6 )	@P,"	:% E5>*
r   r!   N)r   
__future__r   collectionsr   typingr   r   r   zope.interfacer    r
   _conveniencer   	_ithreadsr   r   r!   r   r   r   <module>rd      sO   
 #  * * &   '7 70 Wz z zr   