
    h                        S r SSKJr  SSKrSSKJrJr  SSKJ	r	  SSK
Jr  SSKJr  SSKJr  SS	KJr  \	" S
5      r\" S5      r            SS jrS rS rS rS r/ SQrg)zY
Extended thread dispatching support.

For basic support see reactor threading API docs.
    )annotationsN)CallableTypeVar)	ParamSpec)defer)IReactorFromThreads)failure)
ThreadPool_P_Rc                r   ^ ^ [         R                  " 5       mSUU 4S jjnUR                  " XR/UQ70 UD6  T$ )a  
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.
c                   > U (       a  TR                  TR                  U5        g TR                  TR                  U5        g N)callFromThreadcallbackerrback)successresultdreactors     _/root/1688_scrapy/alibaba-scraper/venv/lib/python3.13/site-packages/twisted/internet/threads.pyonResult#deferToThreadPool.<locals>.onResult9   s.    ""1::v6""199f5    )r   boolr   z_R | BaseExceptionreturnNone)r   DeferredcallInThreadWithCallback)r   
threadpoolfargskwargsr   r   s   `     @r   deferToThreadPoolr$      s:    : "NN,A6 6 ''EdEfEHr   c                J    SSK Jn  [        X3R                  5       U /UQ70 UD6$ )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   )twisted.internetr   r$   getThreadPool)r!   r"   r#   r   s       r   deferToThreadr)   D   s'     )W&;&;&=qR4R6RRr   c                ,    U  H  u  pnU" U0 UD6  M     g)z
Run a list of functions.
N )	tupleListr!   r"   r#   s       r   _runMultipler-   U   s     %	46 %r   c                <    SSK Jn  UR                  [        U 5        g)zu
Run a list of functions in the same thread.

tupleList should be a list of (function, argsList, kwargsDict) tuples.
r   r&   N)r'   r   callInThreadr-   )r,   r   s     r   callMultipleInThreadr0   ]   s     )y1r   c                   ^^^^ [         R                   " 5       mUUUU4S jnU R                  U5        TR                  5       n[        U[        R
                  5      (       a  UR                  5         U$ )aQ  
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                 p   > [         R                  " T/TQ70 TD6n U R                  TR                  5        g r   )r   maybeDeferredaddBothput)r   ar!   kwqueues    r   _callFromThread/blockingCallFromThread.<locals>._callFromThread   s-    $$Q11b1uyy!r   )Queuer   get
isinstancer	   FailureraiseException)r   r!   r6   r7   r9   r   r8   s    ```  @r   blockingCallFromThreadr@   h   sW    , KKME" " ?+YY[F&'//**Mr   )r)   r$   r0   r@   )r   r   r    r
   r!   zCallable[_P, _R]r"   z_P.argsr#   z	_P.kwargsr   zdefer.Deferred[_R])__doc__
__future__r   r8   r;   typingr   r   typing_extensionsr   r'   r   twisted.internet.interfacesr   twisted.pythonr	   twisted.python.threadpoolr
   r   r   r$   r)   r-   r0   r@   __all__r+   r   r   <module>rI      s    #  $ ' " ; " 0t_T]' '' ' 	'
 ' 'TS"2 Fr   