
    tf*                    (   d Z ddlmZ ddlmZmZ ddlmZmZm	Z	m
Z
mZ ddlmZmZmZ ddlmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZ  ed          Z ed          Z G d de          Z G d de          Z e             Z! G d d          Z"dS )z
twisted.python.threadpool: a pool of threads to which we dispatch tasks.

In most cases you can just use C{reactor.callInThread} and friends
instead of creating a thread pool directly.
    )annotations)Threadcurrent_thread)AnyCallableListOptionalTypeVar)	ParamSpecProtocol	TypedDict)pool)contextlog)
deprecated)Failure)Version_P_Rc                      e Zd ZddZdS )_SupportsQsizereturnintc                    d S N selfs    X/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/python/threadpool.pyqsizez_SupportsQsize.qsize   s        Nr   r   __name__
__module____qualname__r    r   r!   r   r   r      s(             r!   r   c                  $    e Zd ZU ded<   ded<   dS )_Stater   minmaxN)r$   r%   r&   __annotations__r   r!   r   r(   r(   "   s"         HHHHHHHHr!   r(   c                  b   e Zd ZdZdZdZdZdZdZe	Z
 e  e edddd	          d
          e                    Z ee          Z	 d2d3dZed4d            Zed5d            Zed5d            Zed6d            ZeZd7dZd7dZd8dZd7dZd9d!Zd:d"Zd;d)Zd<d-Zd7d.Z 	 d=d>d0Z!d7d1Z"dS )?
ThreadPoola  
    This class (hopefully) generalizes the functionality of a pool of threads
    to which work can be dispatched.

    L{callInThread} and L{stop} should only be called from a single thread.

    @ivar started: Whether or not the thread pool is currently running.
    @type started: L{bool}

    @ivar threads: List of workers currently running in this thread pool.
    @type threads: L{list}

    @ivar _pool: A hook for testing.
    @type _pool: callable compatible with L{_pool}
          FNTwisted      r   zthreading.current_thread)versionreplacement
minthreadsr   
maxthreadsnameOptional[str]c                     |dk    s
J d            ||k    s
J d            | _         | _        | _        g  _        d fd	}d fd}                     ||           _        dS )ac  
        Create a new threadpool.

        @param minthreads: minimum number of threads in the pool
        @type minthreads: L{int}

        @param maxthreads: maximum number of threads in the pool
        @type maxthreads: L{int}

        @param name: The name to give this threadpool; visible in log messages.
        @type name: native L{str}
        r   minimum is negativeminimum is greater than maximumar   kwr   r   c                 ~     j         | d                                i|}j                            |           |S )Nr7   )threadFactory_generateNamethreadsappend)r<   r=   threadr   s      r   trackingThreadFactoryz2ThreadPool.__init__.<locals>.trackingThreadFactory`   sS    'T'++--13 F L'''Mr!   r   c                 $     j         sdS  j        S )Nr   )startedr*   r   s   r   currentLimitz)ThreadPool.__init__.<locals>.currentLimitg   s    < q8Or!   N)r<   r   r=   r   r   r   r"   )r)   r*   r7   rA   _pool_team)r   r5   r6   r7   rD   rG   s   `     r   __init__zThreadPool.__init__J   s     Q 5Z''')J'''	%'	 	 	 	 	 		 	 	 	 	 	
 ZZ.CDD


r!   r   c                R    | j                                         }|j        |j        z   S )a  
        For legacy compatibility purposes, return a total number of workers.

        @return: the current number of workers, both idle and busy (but not
            those that have been quit by L{ThreadPool.adjustPoolsize})
        @rtype: L{int}
        )rI   
statisticsidleWorkerCountbusyWorkerCount)r   statss     r   workerszThreadPool.workersn   s(     
%%''$u'<<<r!   
list[None]c                F    dg| j                                         j        z  S )z
        For legacy compatibility purposes, return the number of busy workers as
        expressed by a list the length of that number.

        @return: the number of workers currently processing a work item.
        @rtype: L{list} of L{None}
        N)rI   rL   rN   r   s    r   workingzThreadPool.workingz   s"     v
--//???r!   c                F    dg| j                                         j        z  S )a,  
        For legacy compatibility purposes, return the number of idle workers as
        expressed by a list the length of that number.

        @return: the number of workers currently alive (with an allocated
            thread) but waiting for new work.
        @rtype: L{list} of L{None}
        N)rI   rL   rM   r   s    r   waiterszThreadPool.waiters   s"     v
--//???r!   r   c                6      G  fdd          } |            S )z
        For legacy compatibility purposes, return an object with a C{qsize}
        method that indicates the amount of work not yet allocated to a worker.

        @return: an object with a C{qsize} method.
        c                      e Zd Zd fdZdS )$ThreadPool._queue.<locals>.NotAQueuer   r   c                @    j                                         j        S )a  
                Pretend to be a Python threading Queue and return the
                number of as-yet-unconsumed tasks.

                @return: the amount of backlogged work not yet dispatched to a
                    worker.
                @rtype: L{int}
                )rI   rL   backloggedWorkCount)qr   s    r   r    z*ThreadPool._queue.<locals>.NotAQueue.qsize   s     z,,..BBr!   Nr"   r#   r   s   r   	NotAQueuerX      s;        	C 	C 	C 	C 	C 	C 	C 	Cr!   r\   r   )r   r\   s   ` r   _queuezThreadPool._queue   sM    
	C 
	C 
	C 
	C 
	C 
	C 
	C 
	C 
	C 
	C y{{r!   Nonec                    d| _         d| _        |                                  | j                                        j        }|r| j                            |           dS dS )z'
        Start the threadpool.
        FTN)joinedrF   adjustPoolsizerI   rL   rZ   grow)r   backlogs     r   startzThreadPool.start   sf     *''))= 	%JOOG$$$$$	% 	%r!   c                :    | j                             d           dS )z
        Increase the number of available workers for the thread pool by 1, up
        to the maximum allowed by L{ThreadPool.max}.
        r2   N)rI   rb   r   s    r   startAWorkerzThreadPool.startAWorker   s    
 	
r!   strc                D    d| j         pt          |            d| j         S )z
        Generate a name for a new pool thread.

        @return: A distinctive name for the thread.
        @rtype: native L{str}
        zPoolThread--)r7   idrP   r   s    r   r@   zThreadPool._generateName   s*     DTY2"T((CCT\CCCr!   c                :    | j                             d           dS )zn
        Decrease the number of available workers by 1, by quitting one as soon
        as it's idle.
        r2   N)rI   shrinkr   s    r   stopAWorkerzThreadPool.stopAWorker   s     
 	
!r!   stater(   c                t    t          | d|           t                              | | j        | j                   d S )N__dict__)setattrr-   rJ   r)   r*   )r   rn   s     r   __setstate__zThreadPool.__setstate__   s6    j%(((D$(DH55555r!   c                8    t          | j        | j                  S )N)r)   r*   )r(   r)   r*   r   s    r   __getstate__zThreadPool.__getstate__   s    $(1111r!   funcCallable[_P, object]args_P.argsr=   	_P.kwargsc                *     | j         d|g|R i | dS )a   
        Call a callable object in a separate thread.

        @param func: callable object to be called in separate thread

        @param args: positional arguments to be passed to C{func}

        @param kw: keyword args to be passed to C{func}
        N)callInThreadWithCallback)r   ru   rw   r=   s       r   callInThreadzThreadPool.callInThread   s/     	&%dD>4>>>2>>>>>r!   onResult&Optional[Callable[[bool, _R], object]]Callable[_P, _R]c                    | j         rdS t          j                                        j        d         dfdfd_        |_        | j                                       dS )a$  
        Call a callable object in a separate thread and call C{onResult} with
        the return value, or a L{twisted.python.failure.Failure} if the
        callable raises an exception.

        The callable is allowed to block, but the C{onResult} function must not
        block and should perform as little work as possible.

        A typical action for C{onResult} for a threadpool used with a Twisted
        reactor would be to schedule a L{twisted.internet.defer.Deferred} to
        fire in the main reactor thread using C{.callFromThread}.  Note that
        C{onResult} is called inside the separate thread, not inside the
        reactor thread.

        @param onResult: a callable with the signature C{(success, result)}.
            If the callable returns normally, C{onResult} is called with
            C{(True, result)} where C{result} is the return value of the
            callable.  If the callable throws an exception, C{onResult} is
            called with C{(False, failure)}.

            Optionally, C{onResult} may be L{None}, in which case it is not
            called at all.

        @param func: callable object to be called in separate thread

        @param args: positional arguments to be passed to C{func}

        @param kw: keyword arguments to be passed to C{func}
        Nr   r^   c                    	                                  } d}n # t          $ r t                      } d}Y nw xY wd _         j                            ||            d _        d S |st	          j        |            d S d S )NTF)theWorkBaseExceptionr   r}   r   err)resultok	inContexts     r   r   z6ThreadPool.callInThreadWithCallback.<locals>.inContext  s    "**,,      !%I!-""2v...%)	"""     s    77c                 0    t          j        g R i S r   )r   call)rw   ctxru   r=   s   r   <lambda>z5ThreadPool.callInThreadWithCallback.<locals>.<lambda>  s2    GL%
%
 %
 %
 "%
 %
 r!   r   r^   )	r`   r   theContextTrackercurrentContextcontextsr   r}   rI   do)r   r}   ru   rw   r=   r   r   s     ```@@r   r{   z#ThreadPool.callInThreadWithCallback   s    H ; 	F'6688A"E	  	  	  	  	  	 $
 
 
 
 
 
 
	 &	
i     r!   c                    d| _         d| _        | j                                         | j        D ]}|                                 dS )z9
        Shutdown the threads in the threadpool.
        TFN)r`   rF   rI   quitrA   join)r   rC   s     r   stopzThreadPool.stop$  sN     
l 	 	FKKMMMM	 	r!   Optional[int]c                x   || j         }|| j        }|dk    s
J d            ||k    s
J d            || _         || _        | j        sdS | j        | j        k    r'| j                            | j        | j        z
             | j        | j         k     r)| j                            | j         | j        z
             dS dS )z
        Adjust the number of available threads by setting C{min} and C{max} to
        new values.

        @param minthreads: The new value for L{ThreadPool.min}.

        @param maxthreads: The new value for L{ThreadPool.max}.
        Nr   r:   r;   )r)   r*   rF   rP   rI   rl   rb   )r   r5   r6   s      r   ra   zThreadPool.adjustPoolsize.  s     JJQ 5Z''')J'''| 	F <$(""JdlTX5666<$(""JOODHt|344444 #"r!   c                    t          j        d| j                    t          j        d| j                    t          j        d| j                    dS )zw
        Dump some plain-text informational messages to the log about the state
        of this L{ThreadPool}.
        z	waiters: z	workers: ztotal: N)r   msgrU   rS   rA   r   s    r   	dumpStatszThreadPool.dumpStatsM  s[    
 	*DL**+++*DL**+++($,(()))))r!   )r.   r/   N)r5   r   r6   r   r7   r8   r"   )r   rQ   )r   r   r   )r   rg   )rn   r(   r   r^   )r   r(   )ru   rv   rw   rx   r=   ry   r   r^   )
r}   r~   ru   r   rw   rx   r=   ry   r   r^   )NN)r5   r   r6   r   r   r^   )#r$   r%   r&   __doc__r)   r*   r`   rF   r7   r   r?   staticmethodr   r   r   currentThreadrH   rJ   propertyrP   rS   rU   r]   r[   rd   rf   r@   rm   rr   rt   r|   r{   r   ra   r   r   r!   r   r-   r-   *   s?          C
CFGDM L	


GIr1a002	
 	
 	
 	 	 M LE PT"E "E "E "E "EH 	= 	= 	= X	= @ @ @ X@ 	@ 	@ 	@ X	@    X, 	A
% 
% 
% 
%   D D D D   6 6 6 62 2 2 2? ? ? ??! ?! ?! ?!B    MQ5 5 5 5 5>* * * * * *r!   r-   N)#r   
__future__r   	threadingr   r   typingr   r   r   r	   r
   typing_extensionsr   r   r   twisted._threadsr   rH   twisted.pythonr   r   twisted.python.deprecater   twisted.python.failurer   twisted.python.versionsr   r   r   r   r(   object
WorkerStopr-   r   r!   r   <module>r      s  
  # " " " " " , , , , , , , , 9 9 9 9 9 9 9 9 9 9 9 9 9 9 < < < < < < < < < < * * * * * * ' ' ' ' ' ' ' ' / / / / / / * * * * * * + + + + + +Yt__WT]]    X   
    Y   
 VXX
j* j* j* j* j* j* j* j* j* j*r!   