
    ph'                     h    S SK r S SKrS SKJrJrJr   " S S5      rS\ R                  S\4S jrS r	g)	    N)AnyCallable	Coroutinec            	           \ rS rSrSrS rS rS rS\S\	4S jr
S	\S\	4S
 jrS	\S\	S\\\\4   4   4S jrS\R                   S\S\	4S jrS\R                   S	\S\	4S jrS\R                   S	\S\	4S jrSrg)BackgroundScheduler   z^
Schedules background tasks execution either in separate thread or in the running event loop.
c                 b    S U l         / U l        [        R                  " 5       U l        SU l        g )NF)_next_timer_event_loops	threadingLock_lock_stoppedselfs    J/home/james-whalen/.local/lib/python3.13/site-packages/redis/background.py__init__BackgroundScheduler.__init__   s'    ^^%
    c                 $    U R                  5         g N)stopr   s    r   __del__BackgroundScheduler.__del__   s    		r   c                    U R                      U R                  (       a
   SSS5        gSU l        U R                  (       a!  U R                  R                  5         SU l        U R                   H5  nUR                  5       (       d  M  UR                  UR                  5        M7     U R                  R                  5         SSS5        g! , (       d  f       g= f)z2
Stop all scheduled tasks and clean up resources.
NT)	r   r   r
   cancelr   
is_runningcall_soon_threadsafer   clear)r   loops     r   r   BackgroundScheduler.stop   s     ZZ}} Z !DM  '')#'  ))??$$--dii8 * ##% ZZs   C
AC
9C


Cdelaycallbackc                    U R                      U R                  (       a
   SSS5        g SSS5        [        R                  " 5       nU R                      U R                  R                  U5        SSS5        [        R                  " [        X@R                  X/UQ7SS9nUR                  5         g! , (       d  f       N= f! , (       d  f       NY= f)z9
Runs callable task once after certain delay in seconds.
NTtargetargsdaemon)r   r   asyncionew_event_loopr   appendr   Thread_start_event_loop_in_thread_call_laterstart)r   r"   r#   r'   r    threads         r   run_onceBackgroundScheduler.run_once(   s     ZZ}} Z 
 %%'ZZ$$T*  !!.((%ADA

 	 Z Z   B1C1
B?
Cintervalc                    U R                      U R                  (       a
   SSS5        g SSS5        [        R                  " 5       nU R                      U R                  R                  U5        SSS5        [        R                  " [        X@R                  X/UQ7SS9nUR                  5         g! , (       d  f       N= f! , (       d  f       NY= f)z>
Runs recurring callable task with given interval in seconds.
NTr%   )r   r   r)   r*   r   r+   r   r,   r-   _call_later_recurringr/   )r   r4   r#   r'   r    r0   s         r   run_recurring!BackgroundScheduler.run_recurring=   s     ZZ}} Z 
 %%'ZZ$$T*  !!.22HNN

 	 Z Zr3   coro.c                    ^ ^^^^#    T R                      T R                  (       a
   SSS5        g SSS5        [        R                  " 5       m[	        TU/UQ76 mUUU UU4S jmTR                  TT5      T l        g! , (       d  f       NR= f7f)z
Runs recurring coroutine with given interval in seconds in the current event loop.
To be used only from an async context. No additional threads are created.
Nc                     > TR                      TR                  (       a
   S S S 5        g  S S S 5        T" 5         TR                  T T5      Tl        g ! , (       d  f       N-= fr   r   r   
call_laterr
   )r4   r    r   tickwrappeds   r   r>   5BackgroundScheduler.run_recurring_async.<locals>.tick`   sE    ==    I#x>D s   A
A )r   r   r)   get_running_loop_async_to_sync_wrapperr=   r
   )r   r4   r9   r'   r    r>   r?   s   ``  @@@r   run_recurring_async'BackgroundScheduler.run_recurring_asyncR   so      ZZ}} Z  '')(t;d;	? 	?  ??8T:# Zs!   BA=	BAB=
BBr    c                     U R                      U R                  (       a
   S S S 5        g  S S S 5        UR                  " X#/UQ76 U l        g ! , (       d  f       N'= fr   r<   )r   r    r"   r#   r'   s        r   r.   BackgroundScheduler._call_laterl   sD     ZZ}} Z   ??5BTB Zs   A
Ac                     U R                      U R                  (       a
   S S S 5        g  S S S 5        U R                  " XU R                  XU/UQ76   g ! , (       d  f       N/= fr   )r   r   r.   _execute_recurringr   r    r4   r#   r'   s        r   r6   )BackgroundScheduler._call_later_recurringt   sS     ZZ}} Z  	D33TX	
PT	
 Zs   A
A!c                 x   U R                      U R                  (       a
   SSS5        g SSS5         U" U6   U R                      U R                  (       a
   SSS5        g SSS5        U R                  " XU R                  XU/UQ76   g! , (       d  f       Nf= f! [         a     Nof = f! , (       d  f       NP= f)zB
Executes recurring callable task with given interval in seconds.
N)r   r   	Exceptionr.   rH   rI   s        r   rH   &BackgroundScheduler._execute_recurring   s     ZZ}} Z 	dO
 ZZ}} Z  	D33TX	
PT	
 Z  		 Zs(   B
B B+

B
B('B(+
B9)r   r   r
   r   N)__name__
__module____qualname____firstlineno____doc__r   r   r   floatr   r1   r7   r   r   rC   r)   AbstractEventLoopr.   r6   rH   __static_attributes__ r   r   r   r      s    &(e x *e x *;;%-c9S#s]3K.K%L;4C--C6;CGOC
''
 
 	

''
 
 	
r   r   
event_loopcall_soon_cbc           	         [         R                  " U 5        U R                  " X/UQ76    U R                  5          [         R                  " U 5      nU H  nUR                  5         M     U R                  [         R                  " USS065        U R                  5         g! [         a     Nf = f! U R                  5         f = f!  [         R                  " U 5      nU H  nUR                  5         M     U R                  [         R                  " USS065        O! [         a     Of = fU R                  5         f ! U R                  5         f = f= f)z
Starts event loop in a thread and schedule callback as soon as event loop is ready.
Used to be able to schedule tasks using loop.call_later.

:param event_loop:
:return:
return_exceptionsTN)
r)   set_event_loop	call_soonrun_forever	all_tasksr   run_until_completegatherrL   close)rW   rX   r'   pendingtasks        r   r-   r-      s(    :&9D9 	''
3G   ))@4@   		 	''
3G   ))@4@  		 Jsf   C AB! !
B.+B1 -B..B1 1CEADD>
D*'D>)D**D>-E>EEc                     ^ ^^^ UUUU 4S jnU$ )a  
Wraps an asynchronous function so it can be used with loop.call_later.

:param loop: The event loop in which the coroutine will be executed.
:param coro_func: The coroutine function to wrap.
:param args: Positional arguments to pass to the coroutine function.
:param kwargs: Keyword arguments to pass to the coroutine function.
:return: A regular function suitable for loop.call_later.
c                  <   > [         R                  " T" T 0 TD6TS9  g )N)r    )r)   ensure_future)r'   	coro_funckwargsr    s   r   r?   '_async_to_sync_wrapper.<locals>.wrapped   s    i88tDr   rV   )r    rg   r'   rh   r?   s   ```` r   rB   rB      s    E E Nr   )
r)   r   typingr   r   r   r   rT   r-   rB   rV   r   r   <module>rk      s>      + +V
 V
r))9A<r   