o
    Òó·i•  ã                   @  sª   d Z ddlmZ ddlZddlmZmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZ dd	lmZ e	d
ƒZedƒZd#dd„Zdd„ Zdd„ Zdd„ Zd d!„ Zg d"¢ZdS )$zY
Extended thread dispatching support.

For basic support see reactor threading API docs.
é    )ÚannotationsN)ÚCallableÚTypeVar)Ú	ParamSpec)Údefer)ÚIReactorFromThreads)Úfailure)Ú
ThreadPoolÚ_PÚ_RÚreactorr   Ú
threadpoolr	   ÚfúCallable[_P, _R]Úargsú_P.argsÚkwargsú	_P.kwargsÚreturnúdefer.Deferred[_R]c                   s6   t  ¡ ‰ d
‡ ‡fdd„}|j||g|¢R i |¤Ž ˆ S )a3  
    Call the function C{f} using a thread from the given threadpool and return
    the result as a Deferred.

    This function is only used by client code which is maintaining its own
    threadpool.  To run a function in the reactor's threadpool, use
    C{deferToThread}.

    @param reactor: The reactor in whose main thread the Deferred will be
        invoked.

    @param threadpool: An object which supports the C{callInThreadWithCallback}
        method of C{twisted.python.threadpool.ThreadPool}.

    @param f: The function to call.
    @param args: positional arguments to pass to f.
    @param kwargs: keyword arguments to pass to f.

    @return: A Deferred which fires a callback with the result of f, or an
        errback with a L{twisted.python.failure.Failure} if f throws an
        exception.
    ÚsuccessÚboolÚresultú_R | BaseExceptionr   ÚNonec                   s(   | rˆ  ˆ j|¡ d S ˆ  ˆ j|¡ d S ©N)ÚcallFromThreadÚcallbackZerrback)r   r   ©Údr   © ú^C:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\twisted/internet/threads.pyÚonResult9   s   z#deferToThreadPool.<locals>.onResultN)r   r   r   r   r   r   )r   ZDeferredZcallInThreadWithCallback)r   r   r   r   r   r"   r    r   r!   ÚdeferToThreadPool   s   r#   c                 O  s*   ddl m} t|| ¡ | g|¢R i |¤ŽS )at  
    Run a function in a thread and return the result as a Deferred.

    @param f: The function to call.
    @param args: positional arguments to pass to f.
    @param kwargs: keyword arguments to pass to f.

    @return: A Deferred which fires a callback with the result of f,
    or an errback with a L{twisted.python.failure.Failure} if f throws
    an exception.
    r   ©r   N)Útwisted.internetr   r#   ZgetThreadPool)r   r   r   r   r    r    r!   ÚdeferToThreadD   s   r&   c                 C  s"   | D ]\}}}||i |¤Ž qdS )z"
    Run a list of functions.
    Nr    )Ú	tupleListr   r   r   r    r    r!   Ú_runMultipleU   s   ÿr(   c                 C  s   ddl m} | t| ¡ dS )z�
    Run a list of functions in the same thread.

    tupleList should be a list of (function, argsList, kwargsDict) tuples.
    r   r$   N)r%   r   ZcallInThreadr(   )r'   r   r    r    r!   ÚcallMultipleInThread]   s   r)   c                   sD   t   ¡ ‰‡ ‡‡‡fdd„}|  |¡ ˆ ¡ }t|tjƒr | ¡  |S )a•  
    Run a function in the reactor from a thread, and wait for the result
    synchronously.  If the function returns a L{Deferred}, wait for its
    result and return that.

    @param reactor: The L{IReactorThreads} provider which will be used to
        schedule the function call.
    @param f: the callable to run in the reactor thread
    @type f: any callable.
    @param a: the arguments to pass to C{f}.
    @param kw: the keyword arguments to pass to C{f}.

    @return: the result of the L{Deferred} returned by C{f}, or the result
        of C{f} if it returns anything other than a L{Deferred}.

    @raise Exception: If C{f} raises a synchronous exception,
        C{blockingCallFromThread} will raise that exception.  If C{f}
        returns a L{Deferred} which fires with a L{Failure},
        C{blockingCallFromThread} will raise that failure's exception (see
        L{Failure.raiseException}).
    c                    s(   t jˆgˆ ¢R i ˆ¤Ž} |  ˆj¡ d S r   )r   ZmaybeDeferredZaddBothÚput)r   ©Úar   ÚkwÚqueuer    r!   Ú_callFromThread€   s   z/blockingCallFromThread.<locals>._callFromThreadN)ÚQueuer   ÚgetÚ
isinstancer   ZFailureZraiseException)r   r   r,   r-   r/   r   r    r+   r!   ÚblockingCallFromThreadh   s   
r3   )r&   r#   r)   r3   )r   r   r   r	   r   r   r   r   r   r   r   r   )Ú__doc__Ú
__future__r   r.   r0   Útypingr   r   Ztyping_extensionsr   r%   r   Ztwisted.internet.interfacesr   Ztwisted.pythonr   Ztwisted.python.threadpoolr	   r
   r   r#   r&   r(   r)   r3   Ú__all__r    r    r    r!   Ú<module>   s"   
*#