
    Be                         d Z ddlZddlZddlZddlZddlmZ ddlZddlm	Z	m
Z
 ddlmZmZ ddlmZmZ  ej        d	          Z ej        e d
          Z G d dej                  ZdS )z]
Defines callbacks to be executed on a thread or by scheduling it
on a running bokeh server.
    N)partial   )edit_readonlyfunction_name   )LOG_PERIODIC_ENDLOG_PERIODIC_START)curdoc_lockedstatezpanel.callbacksz.PeriodicCallbackc                       e Zd ZdZ ej        d          Z ej        dd          Z ej        dd          Z	 ej
        d	d
          Z ej        dd          Z ej        dd          Z ej
        dd          Z fdZ ej        dd	          d             Z ej        dd	          d             Z ej        dd	          d             ZddZd Zd Zd Zd Zd Zd Z xZS )PeriodicCallbacka  
    Periodic encapsulates a periodic callback which will run both
    in tornado based notebook environments and on bokeh server. By
    default the callback will run until the stop method is called,
    but count and timeout values can be set to limit the number of
    executions or the maximum length of time for which the callback
    will run. The callback may also be started and stopped by setting
    the running parameter to True or False respectively.
    z.
        The callback to execute periodically.docr   z)
        Counts the number of executions.)defaultr   Nz]
        Number of times the callback will be executed, by default
        this is unlimited.Tz>
        Whether the periodic callback should log its actions.i  zB
        Period in milliseconds at which the callback is executed.z[
        Timeout in milliseconds from the start time at which the callback
        expires.FzD
        Toggles whether the periodic callback is currently running.c                     |                     dd          | _         t                      j        di | d | _        d | _        d| _        d | _        d S )N
backgroundF )pop_backgroundsuper__init___start_time_cb	_updating_doc)selfparams	__class__s     2lib/python3.11/site-packages/panel/io/callbacks.pyr   zPeriodicCallback.__init__7   sW    !::lE::""6"""			    running)watchc                 N    | j         r| j        rd S |                                  d S N)r!   r   startr   s    r   _startzPeriodicCallback._start?   s+    | 	t~ 	F

r    c                 N    | j         s| j        rd S |                                  d S r$   )r!   r   stopr&   s    r   _stopzPeriodicCallback._stopE   s+    < 	4> 	F		r    periodc                 h    | j         r*|                                  |                                  d S d S r$   )r   r)   r%   r&   s    r   _update_periodzPeriodicCallback._update_periodK   s4    8 	IIKKKJJLLLLL	 	r    c                 t   ddl m} 	  || j                  5  | j        r;| xj        dz  c_        | j        $| j        | j        k    r|                                  | j        r|                                 nd }d d d            n# 1 swxY w Y   n# t          $ r d }Y nw xY w|r| 	                                 |S )Nr   )
set_curdoc)
r   r/   r   r!   countercountr)   callback	Exception_post_callback)r   postr/   cbs       r   _exec_callbackzPeriodicCallback._exec_callbackQ   s   %%%%%%	DI&& ? ?< $LLA%LLz-$,2K2K		(,>T]]___$? ? ? ? ? ? ? ? ? ? ? ? ? ? ?  	 	 	BBB	 	"!!!	s5   B A B8B BB BB BBc                     t          | j                  }| j        r@| j        r9t                              t          t          | j                  || j                   | j	        sAt          t                    5  t          xj        dz  c_        d d d            n# 1 swxY w Y   | j        =t          j                    | j        z
  dz  }|| j        k    r|                                  | j        | j        k    r|                                  d S d S )Nr   i  )r   r2   r   log_periodic_loggerinfor   idr0   r   r   r   _busy_countertimeouttimer   r)   r1   )r   cbnamedts      r   r4   zPeriodicCallback._post_callback`   s5   t}--9 	 	!! "TY--    	)u%% ) )##q(##) ) ) ) ) ) ) ) ) ) ) ) ) ) )<#)++ 00D8BDL  		<4:%%IIKKKKK &%s   7BB Bc                   K   | j         sAt          t                    5  t          xj        dz  c_        d d d            n# 1 swxY w Y   t	          | j                  }| j        r@| j        r9t          	                    t          t          | j                  || j                   t          j        | j                  pt          j        | j                  }t          j        r\|sZt          j                            | j        d          }|                    t)          t          j        | j                             d S 	 |                                 }t          j        |          r| d {V  n)# t.          $ r t                              d            w xY w|                                  d S # |                                  w xY w)Nr   Tr   zPeriodic callback failed.)r   r   r   r=   r   r2   r   r9   r:   r;   r	   r<   r0   inspectisasyncgenfunctioniscoroutinefunction_thread_poolsubmitr7   add_done_callbackr   _handle_future_exceptionisawaitabler3   	exceptionr4   )r   r@   is_asyncfuturer6   s        r   _periodic_callbackz#PeriodicCallback._periodic_callbackp   s      	)u%% ) )##q(##) ) ) ) ) ) ) ) ) ) ) ) ) ) )t}--9 	 	!!"BtyMM64<   &t}55 7'66 	  	h 	'..t/BDIIF$$WU-KQUQZ%[%[%[\\\F	"$$&&B"2&&  	 	 	MM5666	 !!!!!D!!!!s/   A  AA0E2 1F1 2&FF1 1Gc                    K   	 t          j                    } |             d{V  | j        dz  t          j                    |z
  z
  }|dk    rt          j        |           d{V  e)z
        Run func every interval seconds.

        If func has not finished before *interval*, will run again
        immediately when the previous iteration finished.
        TNg     @@r   )r?   	monotonicr+   asynciosleep)r   funcr%   r>   s       r   _async_repeatzPeriodicCallback._async_repeat   s}      	-N$$E$&&LLLLLLL{5(T^-=-=e-CDG{{mG,,,,,,,,,	-r    c                 .    |                                   d S r$   )r)   )r   session_contexts     r   _cleanupzPeriodicCallback._cleanup   s    		r    c                      j         t          d           j        s#	 d _        d _        d _        n# d _        w xY wt	          j                     _        t          j        r3t          j	         
                     j                             _         dS t          j        rt          j        j        r|t          j         _        t          j        t          j                  r, j                             j         j                   _         dS  j                             j                   dS ddlm}  | fd j                   _          j                                          dS )z7
        Starts running the periodic callback.
        Nz&Periodic callback has already started.TFr   )r   c                  P    t          j                                                   S r$   )rQ   create_taskrN   r&   s   r   <lambda>z(PeriodicCallback.start.<locals>.<lambda>   s    0CDD[D[D]D]0^0^ r    )r   RuntimeErrorr!   r   r?   r   r   _is_pyodiderQ   rZ   rT   rN   curdocrV   r   
_unblockedadd_periodic_callbackr+   add_next_tick_callbackr%   tornado.ioloopr   )r   r   s   ` r   r%   zPeriodicCallback.start   s^    8GHHH| 	''!%#!&&&&&9;; 	*""4#:;; DHHH \ 		el: 		DI-- =9::4;RTXT_``	00<<<<<777777''(^(^(^(^`d`kllDHHNNs   6 	?c                      j         r#	 d _        d _         d _        n# d _        w xY wt          j                   5  d _        ddd           n# 1 swxY w Y   d _        t          j        r j        	                                 n j
        r[ j
        j        r% j
        j                             j                   nJ j
        j        j                             j                   n  j        r j                                         d _         j
        pt#                      }|r+ fd|j        j        D             |j        _        d _
        dS dS )z6
        Stops running the periodic callback.
        TFr   Nc                 &    h | ]}|j         u|S r   )rW   ).0r6   r   s     r   	<setcomp>z(PeriodicCallback.stop.<locals>.<setcomp>   s0     9 9 9T]** ***r    )r!   r   paramdiscard_eventsr0   _timeoutr   r]   r   cancelr   _session_context	callbacksremove_session_callback_session_callbacksremover)   r
   session_destroyed_callbacks)r   r   s   ` r   r)   zPeriodicCallback.stop   s    < 	''!%$!&&&&&!$'' 	 	DL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	HOOY 	y) H	#;;DHEEEE	#6==dhGGGGX 	HMMOOOi*=?? 	9 9 9 9 ]F9 9 9CM5 DIII	 	s     	) AAA)F)__name__
__module____qualname____doc__rg   Callabler2   Integerr0   r1   Booleanr9   r+   r>   r!   r   dependsr'   r*   r-   r7   r4   rN   rT   rW   r%   r)   __classcell__)r   s   @r   r   r      s(         u~ #1 2 2 2H emA ,, - - -G EM$ -   E %- +A B B BC U]3 -E F F FF emD /   G emE 0G H H HG     U]9D)))  *)
 U]9D)))  *)
 U]84(((  )(
      " " "6- - -    8      r    r   )rt   rQ   rC   loggingr?   	functoolsr   rg   utilr   r   r   r	   r   r
   	getLoggerr9   rq   r:   Parameterizedr   r   r    r   <module>r      s               / / / / / / / / 9 9 9 9 9 9 9 9 ' ' ' ' ' ' ' 'g)**$7$%C%C%CDD @ @ @ @ @u* @ @ @ @ @r    