
    l0jP                        d dl mZ d dl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	m
Z
 d dlmZ d dl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 d d
lmZ d dlmZmZm Z   G d d          Z! G d d          Z"dS )    )annotationsN)TimeoutError)deque)Any)Literal)route_utilsroutes)
Estimation
LogMessagePredictBodyProgressProgressUnit)Error)TrackedIterable)run_coro_in_backgroundsafe_get_lockset_task_namec                       e Zd ZddZddd
ZdS )Event	websocketfastapi.WebSocketsession_hashstrfn_indexintc                    || _         || _        || _        | j         d| j         | _        d | _        d | _        d | _        d | _        d| _        t                      | _
        d S )N_F)r   r   r   _iddatalost_connection_timeusernameprogressprogress_pendingr   log_messages)selfr   r   r   s       R/home/wildlama/miniconda3/envs/lam/lib/python3.11/site-packages/gradio/queueing.py__init__zEvent.__init__   sk     #!-%'99$-99(,	26!$()-&+/4ww      codec                L   K   | j                             |           d {V  d S )N)r*   )r   close)r%   r*   s     r&   
disconnectzEvent.disconnect.   s7      n"""-----------r(   N)r   r   r   r   r   r   )r)   )r*   r   )__name__
__module____qualname__r'   r-    r(   r&   r   r      sA        7 7 7 7". . . . . . .r(   r   c                      e Zd ZdJdZdKdZd Zd ZdLdZdMdZdNdZ	dOdZ
dOdZdPdZdQd!ZdRd%ZdSd&ZdPd'ZdOd(ZdTdUd*ZdOd+ZdOd,ZdVd0ZdWd2ZdXd3ZdYd7ZdZd;Zd[d<Zd\d]dBZd^d_dEZd`dHZdIS )aQueuelive_updatesboolconcurrency_countr   update_intervalsfloatmax_size
int | Noneblocks_dependencieslistc                H   t                      | _        g | _        d| _        || _        || _        d g|z  | _        t                      | _        d | _	        d| _
        d| _        d| _        d | _        d| _        || _        d| _        d| _        || _        || _        g | _        d S )NFr      g?g?)r   event_queueevents_pending_reconnectionstoppedmax_thread_countr7   active_jobsr   delete_lock
server_appduration_history_totalduration_history_countavg_process_timeavg_concurrent_process_timequeue_durationr4   sleep_when_freeprogress_update_sleep_when_freer9   r;   continuous_tasks)r%   r4   r6   r7   r9   r;   s         r&   r'   zQueue.__init__3   s     */+-( 1 06:V>O5O(??&'#&'# !+/((#/2, #6 -/r(   Tc                   K   t          | j                   t          | j                   | j        st          | j                   d S d S N)r   start_processingstart_log_and_progress_updatesr4   notify_clients)r%   
ssl_verifys     r&   startzQueue.startO   sT      t4555tBCCC  	8"4#677777	8 	8r(   c                    d| _         d S )NTrA   r%   s    r&   r,   zQueue.closeU   s    r(   c                    d| _         d S NFrV   rW   s    r&   resumezQueue.resumeX   s    r(   app
routes.Appc                    || _         d S rO   )rE   )r%   r[   s     r&   set_server_appzQueue.set_server_app[   s    r(   returnc                ,    d}| j         D ]	}||dz  }
|S )Nr   r>   )rC   )r%   countworkers      r&   get_active_worker_countzQueue.get_active_worker_count^   s.    & 	 	F!
r(   tuple[list[Event] | None, bool]c                8     j         sdS  j                                         }|g}|j         j                 d         }|rT j                 d         }fd j         D             d |dz
           }|                    |            fd|D              ||fS )NrY   batchmax_batch_sizec                *    g | ]}|j         k    |S r1   )r   ).0eventevent_fn_indexs     r&   
<listcomp>z-Queue.get_events_in_batch.<locals>.<listcomp>q   s,       u~7W7W7W7W7Wr(   r>   c                D    g | ]}j                             |          S r1   )r?   removeri   rj   r%   s     r&   rl   z-Queue.get_events_in_batch.<locals>.<listcomp>u   s*    GGGT$$U++GGGr(   )r?   popleftr   r;   extend)r%   first_eventeventsrf   
batch_sizerest_of_batchrk   s   `     @r&   get_events_in_batchzQueue.get_events_in_batche   s      	;&..00$-(8A 	H1.ABRSJ   #'#3  
Q M MM-(((GGGGGGGGu}r(   Nonec                J  K   | j         s| j        s t          j        | j                   d {V  /d | j        vr t          j        | j                   d {V  X| j        4 d {V  |                                 \  }}d d d           d {V  n# 1 d {V swxY w Y   |rt|| j        | j                            d           <   t          | j
        ||          }t          | j                   t          ||d         j        |d         j        |           | j         d S d S )Nr   )rA   r?   asynciosleeprK   rC   rD   rv   indexr   process_eventsbroadcast_live_estimationsr   r   r   )r%   rs   rf   tasks       r&   rP   zQueue.start_processingy   s     , 	W# mD$89999999994+++mD$8999999999' ; ; ; ; ; ; ; ; $ 8 8 : :; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;  WAG !1!7!7!=!=>-d.A65QQ&t'FGGGdF1I$:F1I<NPUVVV! , 	W 	W 	W 	W 	Ws   (B
BBc                
  K   | j         sd | j        D             | j        z   }t          |          dk    r t	          j        | j                   d {V  S|D ]}|j        r^|j        rWd|_        | 	                    ||j        
                                           d {V }|s|                     |           d {V  |                     |           d {V  t	          j        | j                   d {V  | j         d S d S )Nc                     g | ]}||D ]}|S rO   r1   ri   jobevts      r&   rl   z8Queue.start_log_and_progress_updates.<locals>.<listcomp>   s*       3?c??s????r(   r   F)rA   rC   rM   lenry   rz   rL   r#   r"   send_messagedictclean_eventsend_log_updates_for_event)r%   rs   rj   client_awakes       r&   rQ   z$Queue.start_log_and_progress_updates   sy     , 	F #/  %&F 6{{amD$HIIIIIIIII = =) 6en 6-2E*)-):):5%.BUBUBWBW)X)X#X#X#X#X#X#XL' 6"..u55555555555e<<<<<<<<<<- DEEEEEEEEE# , 	F 	F 	F 	F 	Fr(   rj   r   c                   K   	 	 |j                                         }n# t          $ r Y d S w xY w|                     ||                                           d {V }|s|                     |           d {V  xrO   )r$   rp   
IndexErrorr   r   r   )r%   rj   messager   s       r&   r   z Queue.send_log_updates_for_event   s      	.,4466   !%!2!25',,..!I!IIIIIIIL .&&u---------	.s    
--event_idr   	iterableslist[TrackedIterable] | Nonec           
        |d S | j         D ]z}||D ]r}|j        |k    reg }|D ]D}t          |j        |j        |j        |j        |j                  }|                    |           Et          |          |_        d|_
        s{d S )N)r{   lengthunitr"   desc)progress_dataT)rC   r   r   r{   r   r   r"   r   appendr   r#   )r%   r   r   r   r   r   iterableprogress_units           r&   set_progresszQueue.set_progress   s    
 F# 	0 	0C{ 0 07h&&8:M$- < <(4"*.#+?!)%-%6!)) ) ) &,,];;;;#+-#H#H#HCL+/C(0	0 	0r(   loglevelLiteral['info', 'warning']c                    d | j         D             | j        z   }|D ]8}|j        |k    r+t          ||          }|j                            |           9d S )Nc                     g | ]}||D ]}|S rO   r1   r   s      r&   rl   z%Queue.log_message.<locals>.<listcomp>   s*     
 
 
s#3Cr(   )r   r   )rC   rM   r   r   r$   r   )r%   r   r   r   rs   rj   log_messages          r&   r   zQueue.log_message   s    
 
+
 
 
!"  	7 	7EyH$$(   "))+666	7 	7r(   c                    t          | j                  }| j        || j        k    rdS | j                            |           |S )z
        Add event to queue, or return None if Queue is full
        Parameters:
            event: Event to add to Queue
        Returns:
            rank of submitted Event
        N)r   r?   r9   r   )r%   rj   	queue_lens      r&   pushz
Queue.push   sJ     ())	=$dm)C)C4&&&r(   c                   K   || j         v rN| j        4 d {V  | j                             |           d d d           d {V  d S # 1 d {V swxY w Y   d S d S rO   )r?   rD   rn   )r%   rj   s     r&   r   zQueue.clean_event   s      D$$$' / / / / / / / / ''.../ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / %$s   A
AAc                P   K   | j         r|                                  d{V  dS dS )z
        Runs 2 functions sequentially instead of concurrently. Otherwise dced clients are tried to get deleted twice.
        N)r4   broadcast_estimationsrW   s    r&   r}   z Queue.broadcast_live_estimations   sG        	/,,...........	/ 	/r(   <   c                   K   |j         so|                     |ddi           d{V }|sdS |                     ||           d{V \  }}|s$|                     |dddidd	           d{V  dS ||_         d
S )z
        Gather data for the event
        Parameters:
            event: the Event to gather data for
            receive_timeout: how long to wait for data to be received from frontend
        msg	send_dataNFtimeoutprocess_completederrorz!Time out uploading data to serverr   outputsuccessT)r   r   get_message)r%   rj   receive_timeoutr   r   s        r&   gather_event_datazQueue.gather_event_data   s       z 	!%!2!255+:N!O!OOOOOOOL u'+'7'7'7'W'W!W!W!W!W!W!WD,  ''2#*,O"P#(          uEJtr(   c                   K   | j         sIt          j        | j                   d{V  | j        r|                                  d{V  | j         GdS dS )zQ
        Notify clients about events statuses in the queue periodically.
        N)rA   ry   rz   r7   r?   r   rW   s    r&   rR   zQueue.notify_clients	  s       , 	3- 5666666666 300222222222 , 	3 	3 	3 	3 	3r(   c                    K                                     t          j         fdt           j                  D               d {V  d S )Nc                D    g | ]\  }}                     ||          S r1   )send_estimation)ri   rankrj   
estimationr%   s      r&   rl   z/Queue.broadcast_estimations.<locals>.<listcomp>  s?       D% $$UJ==  r(   )get_estimationry   gather	enumerater?   )r%   r   s   `@r&   r   zQueue.broadcast_estimations  s      ((**
n    #,T-=#>#>  
 	
 	
 	
 	
 	
 	
 	
 	
 	
r(   r   r
   r   c                0  K   ||_         | j        :|j         | j        z  | j        z   |_        d| j        vr|xj        | j        z  c_        |                     ||                                           d{V }|s|                     |           d{V  |S )z
        Send estimation about ETA to the client.

        Parameters:
            event:
            estimation:
            rank:
        N)r   rI   rH   rank_etarC   r   r   r   )r%   rj   r   r   r   s        r&   r   zQueue.send_estimation  s       
+7$"BB'(  4+++##t'GG##!..ujoo6G6GHHHHHHHH 	*""5)))))))))r(   durationc                    | xj         |z  c_         | xj        dz  c_        | j         | j        z  | _        | j        t          | j        | j                  z  | _        | j        t          | j                  z  | _        dS )zt
        Update estimation by last x element's average duration.

        Parameters:
            duration:
        r>   N)	rF   rG   rH   minrB   rI   r   r?   rJ   )r%   r   s     r&   update_estimationzQueue.update_estimation6  s     	##x/####q(##'$*EE 	 ,0+@3!4#>D
 D
 ,
( #>TEUAVAVVr(   c                j    t          t          | j                  | j        | j        | j                  S )N)
queue_sizeavg_event_process_time!avg_event_concurrent_process_time	queue_eta)r
   r   r?   rH   rI   rJ   rW   s    r&   r   zQueue.get_estimationG  s9    4+,,#'#8.2.N)	
 
 
 	
r(   r   r   dict[str, Any]c                   t          |j                  t          |j                  t          |j                  t          |j                  |j        j        |j        j        dd}	 |j	        |d<   n# t          $ r Y nw xY w|S )N)hostport)urlheadersquery_paramspath_paramsclientsession)r   r   r   r   r   r   r   r   r   r   	Exception)r%   r   paramss      r&   get_request_paramszQueue.get_request_paramsO  s    y}%%I-.. !788	 566(/4i>N>STT
 
	 !    	 	 	D	s   )
A4 4
B Brs   list[Event]rf   c                   K   |d         j         }|
J d            |d         j        }|s|d         j        nd |_        	                      |d         j                  |_        n# t          $ r Y nw xY w|r?t          t          d |D                        |_          fd|D             |_        d|_
         j        }|t          d          d}t          j        |||          }t          j        ||||d 	          }	 t          j        ||||
           d {V }	nt# t          $ rg}
|                                j        pt'          |
t(                    }t+          j                     t          |rt/          |
          nd           |
d }
~
ww xY w|j        j        }t'          |t4          j        j                  r|j        }n|} ||	          }t=          j        |j         !                                          }|S )Nr   zNo event datac                4    g | ]}|j         	|j         j         S r1   r   )ri   rj   s     r&   rl   z)Queue.call_prediction.<locals>.<listcomp>j  s#    "U"U"Uu%*"U5:?"U"U"Ur(   c                R    g | ]#}|j         	                    |j                  $S r1   )r   r   r   ro   s     r&   rl   z)Queue.call_prediction.<locals>.<listcomp>k  sA       :''88  r(   TServer app has not been set.predict)r[   api_namebody)r[   r   fn_index_inferredr!   request)r[   r   
gr_requestr   )"r   r!   r   r   r   r   r   
ValueErrorr<   zipbatchedrE   r   r   infer_fn_indexcompile_gr_requestcall_process_api
get_blocks
show_error
isinstancer   	traceback	print_excr   routerdefault_response_classfastapidatastructuresDefaultPlaceholdervaluejsonloadsr   decode)r%   rs   rf   r   r!   r[   r   r   r   r   r   r   response_classactual_response_classhttp_responseresponse_jsons   `               r&   call_predictionzQueue.call_prediction_  s     ay~!9%-2<q		226!93FGGDLL 	 	 	D	  	 S"U"U"U"U"UVWWDI   #  DL
  DLo;:;;;'6hT
 
 
 !3/
 
 


	K&7%"3	        FF  	K 	K 	K))4P
5%8P8PJ!!!*>CJJJ$??UJ	K :ng&<&OPP 	3$2$8!!$2!--
 
 
=#5#<#<#>#>??s+   %A' '
A43A4D" "
F,A"FFc           
     d  K   g }	 |D ]T}|                      |           d {V }|r|                     |ddi           d {V }|r|                    |           U|s	 |D ]-}	 |                                 d {V  # t          $ r Y *w xY wd | j        | j                            |          <   |D ]C}|                     |           d {V  |                     |j	        |j
                   d {V  Dd S t          j                    }	 |                     ||           d {V }d }nO# t          $ rB}	d }|	}|D ]1}|                     |ddt          |	          idd           d {V  2Y d }	~	nd }	~	ww xY w|r|                    dd          r|}
|}|rd|                    dd          rM|}
|}g }|D ]9}|                     |d|
|
d ud           d {V }|                    |           :d	 t          ||          D             }|s	 |D ]-}	 |                                 d {V  # t          $ r Y *w xY wd | j        | j                            |          <   |D ]C}|                     |           d {V  |                     |j	        |j
                   d {V  Dd S 	 |                     ||           d {V }d }n# t          $ r}	d }|	}Y d }	~	nd }	~	ww xY w|r|                    dd          M|D ]}||}n|
p|}|                     |           d {V  |                     |dt#          |t                    rdt          |          in||ot#          |t                     d           d {V  n|rt%          j        |          }t)          |          D ]z\  }	}|r6d
|v r2t+          t          |                    d
                     |	         |d
<   |                     |           d {V  |                     |d||d ud           d {V  {t          j                    }||                     ||z
             n&# t          $ r}	t/          |	           Y d }	~	nd }	~	ww xY w|D ]-}	 |                                 d {V  # t          $ r Y *w xY wd | j        | j                            |          <   |D ]C}|                     |           d {V  |                     |j	        |j
                   d {V  Dd S # |D ]-}	 |                                 d {V  # t          $ r Y *w xY wd | j        | j                            |          <   |D ]C}|                     |           d {V  |                     |j	        |j
                   d {V  Dw xY w)Nr   process_startsr   r   Fr   is_generatingprocess_generatingc                    g | ]	\  }}||
S r1   r1   )ri   eis_opens      r&   rl   z(Queue.process_events.<locals>.<listcomp>  s1     $ $ $(a'$$ $ $r(   r   )r   r   r   r-   r   rC   r{   r   reset_iteratorsr   r   timer   r   getr   r   r   copydeepcopyr   r<   r   print)r%   rs   rf   awake_eventsrj   r   
begin_timeresponseerrr   old_responseold_erropen_wsopenrelevant_responser   end_times                    r&   r|   zQueue.process_events  s,	     $&j	O / /%)%;%;E%B%BBBBBBB )-):):'78* * $ $ $ $ $ $L   / ''... h &  **,,,,,,,,,,    D?CDT-33F;;< O O&&u---------
 **5+=u~NNNNNNNNNNO Os J!%!5!5lE!J!JJJJJJJ   )  E++#6'.A&7',                <HLL%@@ <'  8<<#G#G  #+L!G G!- 	- 	-%)%6%6!';*6+7t+C & &              t,,,,$ $,/g,F,F$ $ $L ( \ &  **,,,,,,,,,,    D?CDT-33F;;< O O&&u---------
 **5+=u~NNNNNNNNNNO Og )-)=)=lE)R)R#R#R#R#R#R#R"$      #' -   8<<#G#G  2 *  E',/)),8,CG)99%@@@@@@@@@++#6)*;YGG'3w4E0F0F&G&G!2'8 (M$./@)$L$L L 
 
 
 
 
 
 
 
 
 
"  x00 ), 7 7  HAu M6!1!1)-c8<<3G3G.H)I)I!)Lv99         ++#6&,'/t';           y{{H#&&x*'<=== 	 	 	!HHHHHHHH	 &  **,,,,,,,,,,    D?CDT-33F;;< O O&&u---------
 **5+=u~NNNNNNNNNNO O &  **,,,,,,,,,,    D?CDT-33F;;< O O&&u---------
 **5+=u~NNNNNNNNNNOs   AQ %B  
BB:Q D- ,Q -
E978E4/Q 4E99BQ H33
I ?I .K Q 
K%K Q  K%%E/Q T 
Q8Q3.T 3Q88T  R
R('R(V/T65V/6
U	 V/U	A,V/r>   r   r   r   float | intc                   K   	 t          j        |j                            |          |           d {V  dS # t          $ r |                     |           d {V  Y dS w xY w)Nr   r   TF)ry   wait_forr   	send_jsonr   r   )r%   rj   r   r   s       r&   r   zQueue.send_message  s      	"))t)44g          4 	 	 	""5)))))))))55	s   5; %A$#A$   tuple[PredictBody | None, bool]c                   K   	 t          j        |j                                        |           d {V }t	          di |dfS # t
          $ r |                     |           d {V  Y dS w xY w)Nr   TrY   r1   )ry   r  r   receive_jsonr   AsyncTimeOutErrorr   )r%   rj   r   r   s       r&   r   zQueue.get_message  s      	 ),,..        D &&&&,,  	 	 	""5)))))))));;	s   A A %A.-A.r   r   c                  K   | j         }|t          d          ||j        vrd S |j        4 d {V  d |j        |         |<   |j        |                             |           d d d           d {V  n# 1 d {V swxY w Y   d S )Nr   )rE   r   	iteratorslockiterators_to_resetadd)r%   r   r   r[   s       r&   r   zQueue.reset_iterators"  s     o;:;;;s},,F8 	? 	? 	? 	? 	? 	? 	? 	?48CM,'1"<044X>>>	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	s   1A66
B B N)
r4   r5   r6   r   r7   r8   r9   r:   r;   r<   )T)r[   r\   )r_   r   )r_   rd   )r_   rw   )rj   r   r_   rw   )r   r   r   r   )r   r   r   r   r   r   )rj   r   r_   r:   )r   )rj   r   r_   r5   )rj   r   r   r
   r   r   r_   r
   )r   r8   r_   rw   )r_   r
   )r   r   r_   r   )rs   r   rf   r5   )rs   r   rf   r5   r_   rw   )r>   )r   r   r   r  r_   r5   )r  )r_   r  )r   r   r   r   )r.   r/   r0   r'   rT   r,   rZ   r^   rc   rv   rP   rQ   r   r   r   r   r   r}   r   rR   r   r   r   r   r   r   r|   r   r   r   r1   r(   r&   r3   r3   2   sK       0 0 0 088 8 8 8             (W W W W&F F F F(. . . .0 0 0 027 7 7 7"   / / / /
/ / / /    63 3 3 3
 
 
 
   4W W W W"
 
 
 
    ? ? ? ?BlO lO lO lO\             r(   r3   )#
__future__r   ry   r  r   r  r   r   r  collectionsr   typingr   r   typing_extensionsr   gradior   r	   gradio.data_classesr
   r   r   r   r   gradio.exceptionsr   gradio.helpersr   gradio.utilsr   r   r   r   r3   r1   r(   r&   <module>r'     s   " " " " " "         5 5 5 5 5 5              % % % % % % & & & & & & & &              $ # # # # # * * * * * * M M M M M M M M M M. . . . . . . .,{ { { { { { { { { {r(   