o
    >h                     @  s   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 dZe
eG dd dZdS )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                   @  s   e Zd ZdZddd	Zd
S )
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}
    idleWorkerCountintbusyWorkerCountbackloggedWorkCountreturnNonec                 C  s   || _ || _|| _d S N)r   r   r   )selfr   r   r    r   v/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/site-packages/twisted/_threads/_team.py__init__%   s   
zStatistics.__init__N)r   r   r   r   r   r   r   r   )__name__
__module____qualname____doc__r   r   r   r   r   r      s    r   c                   @  sn   e Zd ZdZd&dd	Zd'ddZd(ddZd)d*ddZd)d*ddZd+ddZ	d,ddZ
d-d"d#Zd.d$d%ZdS )/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.
    coordinatorr   createWorkerCallable[[], Optional[IWorker]]logExceptionCallable[[], None]c                 C  s@   t  | _|| _|| _|| _t | _d| _t | _	d| _
d| _dS )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   r   r   r    r   r   r   r   M   s   
zTeam.__init__r   r   c                 C  s   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   r   r   r   
statisticsm   s   zTeam.statisticsnr   r   c                   s&   j   jjd fdd}dS )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}
        r   r   c                    s2   t  D ]}  }|d u r d S | qd S r   )ranger$   _recycleWorker)xworkerr/   r   r   r   createOneWorker~   s   z"Team.grow.<locals>.createOneWorkerNr   r   r"   checkr#   do)r   r/   r5   r   r4   r   growu   s   
z	Team.growNOptional[int]c                   s$   j   j fdd dS )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                     s
     S r   )_quitIdlersr   r4   r   r   <lambda>      
 zTeam.shrink.<locals>.<lambda>Nr7   )r   r/   r   r4   r   shrink   s   
zTeam.shrinkc                 C  sp   |du rt | j| j }t|D ]}| jr| j   q|  jd7  _q| jr4| jdkr6| j  dS dS dS )z|
        The implmentation of C{shrink}, performed by the coordinator worker.

        @param n: see L{Team.shrink}
        Nr   r   )	r,   r'   r(   r0   popquitr+   r*   r#   )r   r/   r2   r   r   r   r<      s   zTeam._quitIdlerstaskCallable[[], object]c                   s$    j    j fdd dS )zu
        Perform some work in a worker created by C{createWorker}.

        @param task: the callable to run
        c                     s
     S r   )_coordinateThisTaskr   r   rB   r   r   r=      r>   zTeam.do.<locals>.<lambda>Nr7   rE   r   rE   r   r9      s   
zTeam.doCallable[..., object]c                   s^   j rj  n }|du rj dS |  jd7  _|jd fdd}dS )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   r   r   c                    sB   z  W n t y     Y nw jjd fdd} d S )Nr   r   c                     s    j d8  _   d S )Nr   )r(   r1   r   )not_none_workerr   r   r   idleAndPending   s   z@Team._coordinateThisTask.<locals>.doWork.<locals>.idleAndPendingr6   )BaseExceptionr%   r#   r9   )rH   rG   r   rB   r   r   doWork   s   
z(Team._coordinateThisTask.<locals>.doWorkr6   )r'   r@   r$   r)   appendr(   r9   )r   rB   r3   rK   r   rJ   r   rD      s   
zTeam._coordinateThisTaskr3   r	   c                 C  sl   | j | | jr| | j  dS | jr|   dS | jdkr4|  jd8  _| j | |	  dS dS )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)   rD   popleftr*   r<   r+   removerA   )r   r3   r   r   r   r1      s   	
zTeam._recycleWorkerc                   s$    j    jjd fdd}dS )zA
        Stop doing work and shut down all idle workers.
        r   r   c                     s   d _    d S )NT)r*   r<   r   r-   r   r   startFinishing   s   z!Team.quit.<locals>.startFinishingNr6   )r"   r&   r#   r9   )r   rP   r   r-   r   rA      s   
z	Team.quit)r   r   r   r   r    r!   )r   r   )r/   r   r   r   r   )r/   r;   r   r   )rB   rC   r   r   )rB   rF   r   r   )r3   r	   r   r   r6   )r   r   r   r   r   r.   r:   r?   r<   r9   rD   r1   rA   r   r   r   r   r   -   s    

 


	
r   N)r   
__future__r   collectionsr   typingr   r   r   zope.interfacer    r	   _conveniencer
   	_ithreadsr   r   r   r   r   r   r   <module>   s   